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

qnikst
? Haskell хочется_странного Есть
data Foo =
A1 :: forall x . TVar (Either E x) -> ...
A2 :: forall x . TVar (Either E x) -> ...
...

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

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

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

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

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

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

Как сделать, чтобы и то и другое работало и запрос не надо бы было паковать в гадт?
qnikst
? Haskell хочется_странного а можно ли написать:
```
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 такой если что
qnikst
Haskell хочется_странного хочу 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), который совсем похожий. В итоге было бы круто если бы такие бредовые типы можно было локализировать в функции. Кого позвать?
qnikst
Haskell хочется_странного decodeAnyResource :: forall p t f . Typeable f
=> Proxy (p :: * -> Constraint)
-> Proxy t
-> (f -> A p)
-> (UUID -> String)
-> (forall a . p a => a -> t)
-> RemoteTable
-> ByteString
-> t


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

data Scope = forall a . Serialise a => Scope String (Proxy# a)

есть:

scope :: StaticPtr Scope -> ....

хочу:

scope :: StaticPtr Scope -> a -> ...

и вот этот a должен быть связан с тем. что в Scope, при этом добавить типа-параметр для Scope a нельзя. Это вообще реально?
qnikst
Haskell хочется_странного у меня есть что-то типа:

foo bootstrap run teardown = bootstrap >>= куча-логики (run `finally` teardown)

юзер передает bootstrap, run, teardown и при этом ресурсы выделяются функций вида withFoo её как-т можно в такую логику запихнуть?
qnikst
programming С posix хочется_странного Есть программа (RTS), которая может создавать треды в разные странные моменты обычным pthread_create . Есть специальный superduper_thread_create, который создает нужные мне треды, но взять и перевести на него RTS неполучится (лень). Так же есть так же специальный метод, который позволяет конвертировать обычный posix тред в superduper тред.

Вопрос, есть ли какие-либо средства для автоматизации вызова функции конвертации треда в специальный после вызова pthread_create
qnikst
Haskell хочется_странного Хочу что-то вроде cross-module афинной системы типов. Т.е. у меня есть правила зависящие от событий, хочу чтобы система типов проверяла, что в проекте есть хоть что-то, что такие события создает.