to post messages and comments.

@qnikst:

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

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

@qnikst:

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

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

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

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

@qnikst:

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

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

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

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

@qnikst:

а можно ли написать:
```
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:

хочу 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:

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


давно такой радости не писал, ну хоть чуть весело.

@segfault:

А где бы скрафтить тонны типичного современного английского текста для анализа?

@qnikst:

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

@qnikst:

У меня такой вопрос, есть:

class Foo a where foo :: proxy a -> UUID

у меня есть (n::TH.Type), я могу сделать reifyInstances ''Foo n и получить instance Foo, вопрос, а могу ли я в том же TH получить значение этого UUID?

@qnikst:

Кому книжка нужна?

@qnikst:

Есть немного матметода, вот упороться и реализовать ли его на cmm, или таки по человечески обычным способом. Неопти визирование Reference implementation уже есть

@qnikst:

у меня есть:

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

есть:

scope :: StaticPtr Scope -> ....

хочу:

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

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

@qnikst:

Мне нужно сделать какой-то аналог указателя на статическую область памяти, где лежит стуктурка с описанием нужной фигни. StableNames и указатель на него подойдет?

@qnikst:

у меня есть что-то типа:

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

юзер передает bootstrap, run, teardown и при этом ресурсы выделяются функций вида withFoo её как-т можно в такую логику запихнуть?

@qnikst:

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

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

@segfault:

У меня есть два рефакторинга
1. Было перемещено много файлов в разные каталоги, много из перемещённых файлов еще и редактировались.
2. Массивных перемещений не было, но было много правок в существующих файлах, некоторые файлы были удалены, некоторые созданы
Хочу эти два рефакторинга смержить. Если конкретно, то хочу сказать гиту, что путь A теперь соответстует пути B, путь C соответствует пути D и так далее. Т.е. рефакторинг 2 произвести над теми же файлами в новых путях рефакторинга 1. Нечто вроде git merge -s recursive -X subtree=path но расширенное.

@qnikst:

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

@qnikst:

где бы достать шляпу как у петсона (http://www.kidsreview.ru/sites/default/files/blog_entry_161362.jpg)

@qnikst:

А специализаций для структур данных еще не придумали? Чтобы ! анбоксил полиморфные структуры.

@qnikst:

Есть: A_i — множество
B_i = F(A_i)
C_i = A_i \union B_i
A_{i+1} = B_i \difference A _i

это дело повторять пока A_i \neq \empty.

Как бы это на haskell наиболее человечески выразить, и желательно без сверх сложности..

@qnikst:

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

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 странсформеров..

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

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

@qnikst:

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

@segfault:

Есть дерево "T" , представляющее из себя выражине типа Bool, узлы дерева — логические операторы (and, or, xor, полный перечень зависит от решения), а листья — произвольные логические выражения. Все листья дерева помечены краской. Каждый лист в дереве считать уникальным. Задача: разбить дерево на несколько деревьев, в каждом из которых будут листья одинакового цвета, при этом, должно соблюдаться "(and T1 T2 T3 ...) == T", где T1, T2 — деревья с листьями одного цвета, для любых значений листьев. Листья нельзя выкидывать или использовать повторно в других деревьях, то есть, количество листьев в T должно быть равно сумме листьев в T1, T2 ...

Это случайно не какая-нибудь типовая задачка? Еще небось и библиотечка на хакадже есть?

@qnikst:

В можно ли как-нибудь сделать unique type, который будет с логичным typeable, и одинаков прикомпиляции одной и той же программы на разных платформах

@qnikst:

а реально ли в этих наших хацкелях сделать проксю связанную со значением (значение можно запихивать в RankNType контейнер)?

@qnikst:

а вот реально ли в systemd сделать сервис с вычисляемым статусом, т.е. у меня есть сервис A и зависящий one-shot сервис B, который модифицирует состояние сервиса A. Этот B нужен при первом запуске для конфигурации, в дальнейшем A, будет устанавливать свой стейт правильно, при этом хотелось бы systemd командами видеть, что включено состояние устанавливаемое сервисом B. Это вообще реально?

@qnikst:

Вот есть задача составления расписания с ограничениями, это типичная задача для пролога, классы типов в haskell это prolog-like программирование. Вопрос можно ли решить задачу с составлением расписания чисто на уровне типов в haskell, и какие есть ограничения на задачу, которую можно решить?

@qnikst:

Есть приложение с кучей тредов, которые ждут IO делают IO и ждут таймеров, так вот хотелось бы чтобы тот, кто ждёт таймера был бы с большим приоритетом, т.к. сейчас получается что при heavy CPU bound тасках задержка между временем когда таймер сработает и переключением может пройти слишком много времени.
Какие идеи в т.ч. паранормальные есть?

@qnikst:

а вот stack или cabal осилят сбилдить следующие зависимости:

A.cabal
library
...
executable test-stuff
build-depends: B

B.cabal
library
build-depends: A

т.е. в пакете A есть библиотека, и исполняемый файл зависящий от пакета B, зависящего от билиотеки A.

@segfault:

А вот можно как-нибудь сгенерить теги для когда, сгенерированного в TH? В идеале, чтобы указывали на вызов TH кода, который сгенерировал.

@qnikst:

есть баш скрипт, который при всем том, что делает создает кучу переменных окружения, я хочу их получить после его выхода, как?
запускать через `. my-script.sh`? а можно ли при этом ещё простым образом вернуться к предыдущему состояниб окружения до `. my-script.sh`?

@qnikst:

есть квазицитата, принимающая на вход строку и генерящая много кода:
`schemaQQ :: QuasiQuoter` хочется ей подсовывать файл считанный из файловой системы, как бы это попроще сделать?

@qnikst:

задача.. у меня есть глобальная IORef, пара специальных ядерных потоков, и код, который может хотеть значение в IORef использовать, а может не хотеть. Нужно сделать так, чтобы значение в IORef инициализировалось только если оно кому-нить нужно. (это просто unsafePerformIO initialize).
Дальше сложно, инициализация может проводиться только в ядерном потоке. Соотвественно initКернелПоток $ do initializeЗначение ; программа дальше
работает, но ровно до тех пор пока есть ядерный модуль, иначе все плохо. Вот как бы написать так, чтобы при пинании значения из любого треда оно бы инициализировалось в ядерном.

P.S. пока я писал это я придумал нормальное решение, которое проще и всех устраивает ,но как сделать то, что выше все равно интересно

@qnikst:

Дано: проект (2шт) ну или их кабал файлы, внешний скрипт, который будет запускаться runhaskell (ну или даже пусть executable в одном из пакетов), хочется в скрипте собрать все определенные инстансы.
В принципе это вполне можно сделать если заимпортировать инстансы из всех модулей. Вопрос, как это сделать?
(ну или может можно распарсить .hi файлы, но тогда вопрос чем это сделать просто)

@qnikst:

Максимально глубкий коммит, к которому применяется патч без конфликтов. Как?

@qnikst:

хочу шел, который умеет модифицировать вывод программ о которых он знает, например при запуске the silver searcher, модифицировать все показанные строки в ссылки на вызов vim +number file. Есть что существующее, и куда копать?

@qnikst:

а какие есть "дешевые" по ресурсам CI системы или как их писать, чтобы легко интегрировать с github? А то у меня висят пара дешевых инстансов на DO, на которых только quassel не жручий, и не охота лишние деньги circleCI платить (цена вполне сравнима).

@qnikst:

хочу создать контейнер из контейнера, и нужно там примонтировать файлики (изнутри 1-го контейнера), вопрос, какой путь указывать?

@qnikst:

есть rest сервис, на котором используются несколько подсервисов (общение с хитрым демоно, общение с докером и т.п.). Хочется сделать страничку status, на которой в human readable form был бы результат self check этих сервисов. При этом идеально было бы сделать это так, чтобы при добавлении новых проверок и новых сервисов мне бы нужно было модифицировать минимум кода. Куда копать и какие best practices тут имеются?
Я так понимаю, что минимум кода при модификации это только если TH делать создавать свой класс и собирать инстансы в Main или есть ещё что хорошее?

@qnikst:

есть openvpn-сервер — задача выключать его после периода неактивности, куда копать?