← All posts tagged Haskell

kb
Emacs Haskell Для тех, кто использует \1+\2 советую довесить:

(add-hook 'haskell-mode-hook (lambda () (interactive) (subword-mode 1)))

т.к. в текущем cap-words.el баг и он жадным образом скачет к последнему слову github.com
kb
Haskell yesod Таки, кажется, сделал возможность послать данные через POST в тесте. github.com

// ну и код в этом yesod-test, конечно. Даже мне понятно что фигня. Плюс много сомнений по поводу поддержки стандартов.
kb
Haskell Что ж. В очередной раз открыл для себя метод блокнотика, в этот раз для выписывания типов dl.dropboxusercontent.com

Очень помогает разобраться в коде, прям если бы не поиски откуда импортировать нужные функции, то всё скомпилировалось бы с первого раза.

// сама функция для HSpec добавляет в Spec функцию сетапа, может пригодиться например для удаления БД перед тестами.

Выглядит вот так: gist.github.com
kb
Haskell yesod Persistent прямо поразил своей красотой и чистотой. То, что в ООП-языках приходится делать при помощи создания уродских сущностей, сочетающих в себе и БД-данные и бизнес-модели, там разделили на уровне типов (пусть иногда и сложноватых).
kb
Haskell yesod Уродство hackage.haskell.org . Какой-то dynamic scoping сделали (сделал Снойман этот). В результате тесты выглядят по типу:

entitiesSpecs :: Spec
entitiesSpecs =
ydescribe "/entries/ API tests" $ do
yit "gets empty list of entries" $ do
get EntriesR
statusIs 200
bodyEquals "[]"

Ну и, снова таки, чувак пошёл в сторону "лезть в тестах в кишки UI (HTML)". Видно, что тестов он и правда не пишет, т.к. все тесты UI заканчиваются плачевно при любых редизайнах (превращаются в головную боль).
kb
Haskell Всё никак не привыкну, что много документации и "постов в бложик" написано в виде paper'ов. По монад-трансформерам очень круто, то, чего мне не хватало (а именно — разжевывается практический пример понятным языком) grabmueller.de
kb
Haskell Хотел написать письмо Daan Leijen чтоб сделал хоть какое-нибудь
коммьюнити для Parsec (а то документация, во-первых, скудная,
во-вторых устаревает), а его единственный контактный имейл
университетский уже не работает. На страничке
research.microsoft.com тоже не видно.
kb
Haskell 1. оказывается, х-ль умеет multiline-строки в виде:
a = "foo\
\ bar \
\ baz"
(слэш на новой строке указывает, где она начинается, чтоб можно было выравнивать это безобразие)
2. emacs при этом немного ломается, потому я уж лучше вернусь к "foo" ++ "bar" пока.
kb
Haskell Никто не подскажет как нормально сделать в quickCheck аналог assertEquals? Чтоб красиво diff печатал (можно как-то совсем по-умному, конечно).
kb
Haskell Подскажите, пожалуйста. А не существует ли, случаем, библиотеки, подобной регулярным выражениям, но работающей не для строк, а для произвольных данных? То есть, у меня есть список каких-то собственных сущностей, а мне необходимо делать матчинг в стиле регексов, где каждый из символов — моя сущность. То есть, например, у меня есть:

data Entity = Foo | Bar s
entities :: [Entity]

Мне необходимо как-то написать функцию, которая проматчит какой-то список [Entity] убедившись (и получив позиции), что в нём есть три подряд Foo, после которой Bar в которой s == "barbarbar". Ну, или типа того.

Перед тем, как писать подобное, решил спросить, нету ли еще.
kb
Haskell Сделал вот такой тип (синоним), всё было очень красиво:

type OptionsBlockBounds = (Int, Int)

Далее хотел написать функцию сравнения (объявить инстансом тайпкласса Ord). Я правильно понимаю, что единственный выход — делать вместо type newtype и перелопатить весь код (чтоб заворачивать / разворачивать в дата-конструктор)? Ну, или же сделать кастомную версию compare и передавать в maximumBy (и прочие By-функции)?
kb
Haskell Забавно, как ленивость не вошла в мозг даже авторам realworldhaskell.
Note, though, that the chain is not completely short-circuited. Each (>>=) or (>>) in the chain will still match a Nothing on its left, and produce a Nothing on its right, all the way to the end. It's easy to forget this point: when a computation in the chain fails, the subsequent production, chaining, and consumption of Nothing values is cheap at runtime, but it's not free.book.realworldhaskell.org

Ну неправда же. Всё там будет хорошо и второй аргумент не будет вычисляться.
kb
? Haskell fp Подскажите, пожалуйста, можно ли где-то найти книгу Окасаки (Chris Okasaki — Purely Functional Data Structures) в удобном для чтения, скажем, на андроид-таблетке виде? Или объясните различие между тезисом и книгой, заключается ли оно только в последних нескольких главах, или основной материал тоже.

Нашёл в электронном виде книгу либо в djvu ужасного качества, либо в windows- и macos-only формате каком-то на ebooks.
kb
Haskell ixset Кажется, ixset мне не подходит по памяти (как минимум), буду на нормальную БД пересаживаться. Может вернусь посмотреть на них когда научусь нормально профилировать. gist.github.com
kb
Haskell Ну, то есть, чтоб быть более конкретным. Вот этот код поиска по ключу в списке вида [("key1", "val1"), ("key2", "val2")]

findKey :: (Eq k) => k → [(k,v)] → Maybe v
findKey key = foldr (\(k,v) acc → if key == k then Just v else acc) Nothing

Будет работать эффективно (если вы будете делать findKey key1, то вычислится только нужный кусок и работать будет мгновенно).

p.s.: спасибо SICP :)
kb
Haskell Да уж, ленивость окончательно запутывает и так непростую ситуацию с foldl и foldr. Приходится ломать мозги.

Получается, что, в классическом варианте, когда вы проходите по всему списку, то (по возможности) лучше использовать foldl', т.к. хвостовая рекурсия и всё такое.

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

Или здесь я тоже где-то ошибаюсь? :)