← All posts tagged хочется_странного

Есть
data Foo =
A1 :: forall x . TVar (Either E x) -> ...
A2 :: forall x . TVar (Either E x) -> ...
...

во всех конструкторах есть Either E, у меня есть метод который процессит это Foo, каким бы образом вытащить из него tvar так чтобы туда можно было положить Left E, и не важно какой там x?

Кто-то ведь уже делал тут такую штуку?
есть GADT вида:

data Foo reply where
C1 :: Param1 -> Param2 -> Foo Reply1
C2 :: Param2 -> Param1 -> Foo Reply2
...

есть фунции вида:
handleC1 :: Param1 -> Param2 -> IO Reply1

хочется как-то подешевле в терминах бойлерплейта прицепить эти хэндлеры к C1? Ещё было бы прикольно подешевле их вызывать. Как?

хочется написать что-то вроде:

class T a where type ReqRep a :: -> ; reqrep :: a -> ReqRep a x -> x

для того, чтобы можно было передавать запросы гадтами, которые типизированы возвращаемым результатом. Но при этом я теряю возможность сдеать простые классы, где запрос это Int а релзультат всегда Bool анпример.

Как сделать, чтобы и то и другое работало и запрос не надо бы было паковать в гадт?

а можно ли написать:
```
data Q = Q (forall a . TChan (Request a, TMVar (Reply a)) }
Foo { foo :: Q }
runQ :: Foo -> Request a -> IO (Reply a)
runQ f = case foo f of
Q t = do v <- newEmptyTMVarIO
atomically $ writeTChan t (x,v)
atomically $ takeMVar v
```
и не свести GHC с ума? и не получить unsafeCoerce, Request a это GADT такой если что

хочу local data в haskell вот в посте выше у меня был тип A

data A (c :: * -> Constraint) = forall a . SafeCopy a => A (Dict (c a))

смысла в нём никакого, т.е. просто протаскиваем словарик для экзестенциального типа,
плюс ещё констреинт фиксируется, используется в самой функции, а так же у вызывающего эту функцию, например:

(\(SomeResourceDict (Dict :: Dict (Resource a))) -> A (Dict :: Dict (Resource a)))

Рядом мне нужно сделать data A3 (c :: -> -> * -> Constraint), который совсем похожий. В итоге было бы круто если бы такие бредовые типы можно было локализировать в функции. Кого позвать?

Использование ранк 2 тайпс для защиты ресурсов знакомо всем, но мне хочется идти дальше, мне нужно внутри rank2 уметь инвалидировать ранее созданные в этом ранк 2 ресурсы. Т.е.
```
x <- allocate
use x
foo
Тут x использовать уже нельзя
```
Один вариант это сделать foo CPS но это муторно и будет плохо работать в циклах, есть еще варианты? Indexed Monad взлетит?

Есть программа (RTS), которая может создавать треды в разные странные моменты обычным pthread_create . Есть специальный superduper_thread_create, который создает нужные мне треды, но взять и перевести на него RTS неполучится (лень). Так же есть так же специальный метод, который позволяет конвертировать обычный posix тред в superduper тред.

Вопрос, есть ли какие-либо средства для автоматизации вызова функции конвертации треда в специальный после вызова pthread_create

Вот у меня есть фукнция сделать что-то с сервисом, поидее можно по ноде определить сервис, или по хосту определить её в итоге получаются функции:

doSmth :: Service S -> a -> Process b
doSmthOnNode :: Node -> a -> Process b
doSmthOnAnyNode :: Host -> a -> Proces b

Выглядит это печально, и что делать с этим непонятно, или городить на пустом месте класс типов CanDoSmth с инстансами для Service Node Host, или делать ADT в котором будет Service | Node | Host, или что-то ещё, например 100500 странсформеров..

Причем это простой случай, в более сложном у меня есть функция в процессе вычисления, например берущая что-то из базы, при этом иногда хочется ей дать подсказку и передать данные, например они у меня уже есть и акутальные.

В общем есть хороший вариант передачи "подсказок"

а можно как-нить запустить тред с хацкель вычислениями вне локалити, т.е. есть у меня какой-то блокирующийся код и я хочу гарантировать что все остальные нормальные хацкель треды не заблокируются. По хорошему все сишные вызовы должны быть асинхронными, но это ж си и там бывают баги.