← All posts tagged Haskell

Дано: библиотека, умеющая читать некоторый структурированный формат. Парсит входной поток и отдает его в виде последовательности логических "событий". Интерфейс на C, интересно обернуть его для хаскеля. В связи с этим есть вопросы.

В целом оригинальный интерфейс выглядит как-то так:
stream = xxx_stream_from_fd(0);
// stream' = xxx_stream_from_string(data, length);
reader = xxx_reader_new(stream);
while ((event_type = xxx_reader_get_next_event(reader)) != XXX_EVENT_END_STREAM) {
    switch (event_type) { ... value = xxx_reader_get_???(reader); }
}
xxx_reader_delete(reader);
xxx_stream_delete(reader);

Понятно, что в х-е это должно быть какой-то монадой. 
1. Обязательно ли для случая с from_string чтобы всё происходило в IO? Этого хотелось бы избежать. Как в таком случае должен выглядеть тип, общий для обоих вариантов входных потоков?
2. xxx_reader_get_string возвращает указатель на кусок буфера внутри парсера (для zero copy). Указатель инвалидируется следующим вызовом get_next_event. Возможно ли безопасно описать такой контракт в типах?

Цитата из речи премьер-министра Сингапура:

40 years ago, after doing a math degree, I went on to study computer science, on my father’s advice. He said there is a future in that, and he
was right. So for the Smart Nation Programme Office, I have put Minister
Vivian Balakrishnan in charge, reporting to me. Vivian is both a hacker
and a dabbler – He used to be an eye surgeon but since he does not get to
operate on eyes nowadays, he dabbles in building simple robots, assembling
watches, wireless devices and programming apps. His day job is to be the
Minister for the Environment and Water Resources, and so when he builds
apps, he uses the real time APIs generated by the Ministry. That’s called
user-testing. I used to enjoy this; it is a long time since I’ve done
anything. The last programme I wrote was a Sudoku solver in C++ several
years ago, so I’m out of date. My children are in IT, two of them – both
graduated from MIT. One of them browsed a book and said, “Here, read
this”. It said “Haskell – learn you a Haskell for great good”, and one day
that will be my retirement reading.

via news.ycombinator.com

Можно ли красиво через стандартные функции выразить разбор списка на пару ("всё кроме последних двух элементов", "последний элемент")?
Пока что сделал (init . init $ list, last list), но это уебанство какое-то. А, да, красивое решение делает не более одного прохода по списку.

Не знаю, зачем я полез ее читать, но именно такое впечатление у меня от вступления к статье:
jonmsterling.com
First, the usual boilerplate:

{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE PolyKinds, DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE TypeFamilies, MultiParamTypeClasses #-}
{-# LANGUAGE UndecidableInstances, IncoherentInstances #-}
{-# LANGUAGE FlexibleContexts, FlexibleInstances #-}
{-# LANGUAGE ViewPatterns, UnicodeSyntax #-}
{-# LANGUAGE RankNTypes, GADTs #-}

А расскажите мне за happstack. Какие впечатления от уровня используемого там кода? Возможно ли понять не сильно посвященному? Если писать не слишком напрягаясь, оно будет тормозить и разваливаться?
Собственно, выбираю между хаскелем и эрлангом, на чем вебню писать.

Читаю рассылку: ( groups.google.com )
I've finally decided to complete the remaining exercises in Seven Languages in Seven Weeks, the last of which is "Implement a Monad in a nonfunctional language." So I implemented four of them. In Julia. And wrote a macro so you can use Haskell's do-syntax (with minor differences).комментарий одного из основных разработчиков:
This clearly supports Jeff's characterization of Julia as "dragging Matlab programmers halfway to Haskell".

Для любителей покопаться в чужом говнокоде, выложил засабмиченные решения двух задачек с отборочного тура Code Jam. Заранее оговорюсь --- алгоритмически решения "на отъебись", ибо целью было набрать 20 баллов, не особо много затратив времени. Да, ссылка: gist.github.com и условия: code.google.com

Пошел в гуглоридер, увидел в журнале у thesz ссылку на вчерашнюю статью @dmz, пошел туда смотреть, что в комментах за сутки написали, в комментах скинули на рассказ некоего adept о ICFPC-2006 ( users.livejournal.com ), прочитал весь, посмотрел в конце на ссылку на исходники, и понял, что это тот самый adept, который написал библиотеку haskell-xmpp-1.0, в которой я начал потихоньку ковыряться две недели назад. Вот же блин.

Складывается такое впечатление, что хороший императивный код читается так: "Ага... Ага... Да, понятно примерно, как оно работает", а функциональный --- "Чтоооо?! ... ... ... ... Ох ты ж нихрена себе как красиво все придумали и завернули!". То есть инженеры vs. математики, ага.

Вот я и столкнулся впервые с примером НЁХ в сабже. Если кто желает поразбираться: paste.pocoo.org Суть проблемы: код проходит через все пункты, помеченные putStrLn, но при этом extractSession возвращает Left [] (хотя будучи вызван позже сам по себе, выдает Right "..."), а временный файл не удаляется. Вероятно, я что-то не понимаю в упорядочивании действий, идущих в do-блоке, да?