← All posts tagged Haskell

gist.github.com
Как бы мне вот такой псевдокод писать более красиво и композабельно? Можно взять ResourceT вместо Trans, но он при выходе из монады запустит мне `cleanupRes` а мне этого как раз не надо, поскольку я тут не ресурсы выделяю, а делаю serious business штуки, которые хочется безопасно отменить в случае любых фейлов, а если фейлов не было, то не чистить. И желательно в обратном порядке (последнее cleanup action вызвается первым). Ситуация осложняется большой вложенностью вызовов функций и невозможностью в одном месте сделать такое вот дерево из `catchAll`.

Есть ленивый список значений `list :: [Maybe a]` в котором элементы не зависят друг от друга по данным. Есть функция `findGrail :: [Maybe a] -> b` которая внутри делает `foldl . catMaybes'` . Хочу получить `b` так, чтобы элементы `Maybe a` исходного списка `list` вычислялись параллельно в разных потоках на всех доступных ядрах автоматически. Как максимально просто по-бомжвею это сделать?

А кто-то натыкался на случай, когда изменение кода в одной топ-левел функции вызывало ошибки в других топ-левел функциях, которые до изменения прекрасно компилировались? При чём, изменение касается тела функции (опечатка), а не типа. Т.е. сообщения становятся бесполезными и запутывающими, и указывают вообще не на те декларации, в которых ошибка.