← All posts tagged Haskell

dr-Chaos

Блин, как правильно указать пути к бинарям? Т.е. есть у меня некий антовксий скрипт который делает tar.gz пакет. Если собирать кабалом — путь всегда один и проблем нету. Стек же туда пихает архитектуру и версию кабала. Можно конечно собирать stack build --copy-bins , а потом из stack path --local-bin-path копировать. Может есть ещё способы?

dr-Chaos

Образовалась забавная проблема: один и тот же код собранный ghc 7.6.3 и ghc 7.8.4 после запуска занимает разный private bytes. 6 Мб и 104 Мб соответственно.
Всё бы ничего, но во втором случае довольно быстро кончается память. Подскажите куда копать.
ghc 32 битный, система 64 битная.

dr-Chaos

Пришлось мне все сообщения об ошибках посчтитать и пронумеровать, для того чтоб пользователь моего API мог интернационализировать их. Собственно за базу взял идею wiki.haskell.org . Вместо render можно конечно просто Show использовать, но мне удобнее ByteString . Ну и сделал инстанс Enum. Однако, поскольку не все конструкторы Nullary , toEnum внятный изобразить нельзя.
Внимание вопрос, кошерно ли использовать такой урезанный Enum или лучше навелосипедить свой Message -> Int ?

dr-Chaos

Продолжая вопросы из — #2794212 . Собственно расставлением кучи ! мне удалось заставить вылетать эксепшн в нужном потоке. Однако, мне нифига не понравилась такая т.к. мне кажется это совсем не правильным. Т.е. sink по умолчанию ленивый по своим агрументам, и только после того как я сделал его энегричным, что-то заработало.
Собственно встаёт вопрос как принято решать в кондуитах проблемы с тем что санк с эксепшеном может улететь в другой поток?
Кроме того можно, же воспользоваться decodeOrFail . Но насколько я понимаю тогда придётся воспользоваться map Maybe (...) $$ catMaybe $$ sink . Но информация об ошибке пропадает. Чтоб не пропадала придётся писать свой Conduit.

dr-Chaos

Есть у меня RollingQueue привязанная к UDP сокету. И если в сокет записать херню вылетает эксепшн из Binary десериализатора. Но обрабатывается он совсем не там где я ожидаю. Код тут:
gist.github.com
Подскажите почему так происходит.

dr-Chaos

Есть у меня необходимость слать некие сообщения через UDP, перед посылкой я хочу проверять их длину, а если длина больше датаграммы разбивать на части. Собственно я хочу чтоб кондуит который отправляет сообщения принимал на вход только сообщения проверенной длины.
Собственно вопрос как такие ограничения принято задавать в системе типов?

dr-Chaos

Есть 2 списка [(Int,a)] и [(Int, b)] . Нужно провести классическую sql операцию JOIN , тут вроде просто
[(snd i, snd j) | i <- as, j <- bs, fst i == fst j]. А мне нужен Outer JOIN. Чтоб результатом был [(Maybe a, Maybe b)] .
Как такое принято делать?

dr-Chaos

Есть такой тип данных:
data Result = COk | CFail String

Т.е. что-то вроде Maybe но наоборот. И вот приходится мне комбинировать эти Result в стиле bind (>>=) .
Норот, может есть где-то готовый тип с инстансом Monad ?

dr-Chaos

gist.github.com билд файлик для сборки хаскельного проекта. С созданием шаренного сендбокса и его автообновлением в случе изменения cabal файлов.
Делался для сборки из bamboo.
Может кому ещё пригодится. BTW исправления, дополнения приветствуются.

dr-Chaos

Мануал по установке минимального хаскеля с кабалом без платформы:
1. Скачиваем и ставим MinGW, пропичываем в PATH путь к bin-у.
2. Скачиваем ghc и cabal, распаковываем и прописываем к ним пути в PATH.
3. Запускаем msys-ный bash
3.1 cabal update && cabal install cabal-install
3.2 Прописываем в PATH C:\Users\root\AppData\Roaming\cabal\bin
Енв готов! Поём и пляшем.

dr-Chaos

Залёз тут опять в дебри UDP и ICMP. Походу таки буду делать разбирание/собирание байтстроки на UDP пакеты с исследованием MTU. Тока я смотрю этого на цацкеле никто не пейсал. " Я сильная, я смелая и на голову ебанутая."