?

Log in

No account? Create an account
Main

Забавный Хаскелл-тюториал

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

Haskell Quest Tutorial, как раз то, что надо, когда что-то уже в голове сложилось.

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

Еще один изящный пример работы с ленивыми списками оттуда:

Числа Фибоначчи:
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

take 10 fibs

фибс, -- это список, начальные елементы которого 0 и 1, а дальше получаем суммированием со сдвинутым самим собой, т.е.
[0,1,1,2,3]
и
[1,1,2,3]

И берем 10 первых чисел, так, что бесконечность списка совершенно не мешает:
take 10 fibs


И ведь, зараза, оптимизирует рекурсию, чтобы никаких лишних вычислений. А вы говорите, динамическое программирование!
Tags: ,

Comments

Функциональщики ещё любят пример с qsort приводить, на контрасте с процедурными языками.
Ну и с бесконечными списками и монадами не всё так безоблачно в хаскеле. Когда дело до веб-серверов дело дошло пришлось енумераторы придумывать:
http://www.haskell.org/haskellwiki/Enumerator_and_iteratee
естественно quicksort -- он в learn haskell for the great good тоже есть.

quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) =
let smallerSorted = quicksort (filter (<=x) xs)
biggerSorted = quicksort (filter (>x) xs)
in smallerSorted ++ [x] ++ biggerSorted

После таких записей и алгоритмы запоминать легче.

А вот монады пока не даются.Т.е. я прочитал некоторое количество информации, но сказать "вау я понял!" пока не могу.
По поводу изящной записи алгоритмов есть специальное направление: Functional pearls.

А что монады не даются это обычное дело, похоже. Вот автор как раз эту проблему разбирает:
http://byorgey.wordpress.com/2009/01/12/abstraction-intuition-and-the-monad-tutorial-fallacy/