Подтвердить что ты не робот

Где я могу изучить продвинутый Haskell?

В комментарии к одному из моих ответов SO пользователь sdcwc по существу указал, что следующий код:

comb 0 = [[]]

comb n =
    let rest = comb (n-1)
    in  map ('0':) rest
     ++ map ('1':) rest

можно заменить на:

comb n = replicateM n "01"

который полностью ошеломил меня.

Теперь я ищу учебник, книгу или PDF, который учит этим передовым концепциям. Я не ищу учебник "что монада", нацеленное на новичков или онлайн-ссылок, объясняющих тип replicateM. Я хочу научиться мыслить в монадах и эффективно использовать их, монадические "шаблоны", если хотите.

4b9b3361

Ответ 1

С моей точки зрения (что, безусловно, не является универсальным), я безразличен к монаде списка - в вашем примере я (слабо) утверждаю, что, поскольку существует множество функционалов списка, это было так же хорошо, как совпадение, решение было монадическим функционалом, а не просто функциональным списком (или обобщением функциональности списка через Data.Traversable или Data.Foldable).

Для монадических паттернов я думаю больше об эффекте, чем о конкретных комбинаторах - состояние чтения и записи состояний модели, модели чтения только для чтения "состояние", модели Writer записывают только "состояние", возможно, моделируют частичность (чтобы он мог моделировать ошибки без сообщения об ошибках). Либо/Ошибка моделирует ошибки с осязаемыми кодами ошибок или сообщениями. По мере того, как вы получаете представление об эффектах, вы быстро понимаете, что вам нужно комбинировать их, поэтому трансформаторы монады становятся важными.

На продвинутом Haskell еще нет книг, кроме "Fun of Programming" - это книга с несколькими авторами, в которой собрана какая-то совершенно разрозненная работа, поэтому стоит посмотреть копию, прежде чем решить, стоит ли вам ее книга "Не хочу. В книге Ричарда Берда есть много примеров усовершенствованного кодирования, но он делает это с помощью простого, элегантного кода. Это очень хорошая книга, хотя это не книга о продвинутых языковых функциях.

В отсутствие книг бумаги - лучшее место, поскольку они более отполированы, чем блоги. Наиболее актуальным является симпозиум Haskell (который раньше назывался Haskell Workshop), проверьте приведенную ниже ссылку на материалы, которые будут перечислены в представленных документах, затем выполните поиск всего, что вы найдете интересным - в большинстве случаев авторы публично публикуют эту статью доступны.

http://haskell.org/haskell-symposium/

Ответ 2

Этот фрагмент кода фактически объединяет два довольно скрытых факта о Haskell:

  • Эти строки по умолчанию содержат списки символов
  • Эти списки представляют собой реализацию монады indeterminism, которая перечисляет все возможные пути при объединении.

Следующие фрагменты кода эквивалентны:

replicateM n "12"

replicateM n ['1', '2']

replicateM n $ do c <- ['1', '2']
                  return c

Я бы сказал, что последняя версия на самом деле показывает самое чисто, что происходит в этом случае: у нас есть выбор между "1" и "2" и что n этих вариантов соединены вместе. Как только вы это понимаете, вы настолько продвинуты в своем понимании Хаскелла, как вам нужно. Остальное - всего лишь небольшая часть обфускации.

Ответ 3

Возьмите функции типа sequence, filterM, liftM2, join и подумайте, как они работают для каждой монады IO, [], (->) a, Writer, State. Например, sequence для IO monad последовательно выполняет действия IO:

 [IO a] -> IO [a]

Запишите подпись и попробуйте использовать ее. Некоторые комбинации интересны, а некоторые менее.

Пример для фильтра:

{-# LANGUAGE NoMonomorphismRestriction #-}
import Control.Monad
import Control.Monad.State
import Control.Monad.Reader

a = filterM (\x -> do putStrLn $ "Put " ++ show x ++ "?"
                      fmap (=="Y") getLine)

b = filterM (const [False,True])

c m xs = runState (filterM k xs) 0
              where k x = do a <- get
                             let p = a + x <= m
                             when p $ put (a+x)
                             return p

d = filterM (flip id)

a фильтрует список с помощью IO - он запрашивает у пользователя о каждом элементе.

b фильтрует список недетерминированно - каждый элемент недетерминированно включен и не включен. В результате вы получаете poweret. (Попробуйте!)

c фильтрует список, сохраняя состояние. В этом случае это жадный рюкзак - у вас есть рюкзак с емкостью m и вы хотите вставить столько элементов из xs.

d фильтрует список, поддерживая состояние только для чтения. Это не интересно. Я использовал функцию фильтрации как состояние, и это дает flip filter.

Одна функция filterM может выполнять все эти действия.

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

dup f x = f x x

и как насчет dup' f x = f x x x?

Ответ 4

Действительно дикий/потрясающий материал с монадами - это когда вы выходите за пределы государственной монады и ее подмножеств - писателя и читателя - и начинаете думать о Cont и List, а также о том, что они подразумевают в терминах отступления, комбинации и serach. Я дам больше ссылок позже, но статья Олега и Чун-чи-Шаня LogicT - хорошее начало: http://okmij.org/ftp/Computation/monads.html

EZ Yang приключения в трех монадах от MR 15: http://themonadreader.files.wordpress.com/2010/01/issue15.pdf

Ответы на этот вопрос также могут быть интересны: Творческие использования монад

Ответ 5

Посмотрите на Typeclassopedia в TMR13. Никто другой не предложил этого, и это помогло мне задуматься о различных типах классов, которые предоставляет Haskell очень.

Примечание: он обновляется до второго издания, но первое издание по-прежнему актуально и информативно.

Ответ 6

Два хороших источника для меня, чтобы узнать о хороших концепциях языка Haskell, были http://learnyouahaskell.com/ и http://www.realworldhaskell.org/blog/, которые вы можете использовать онлайн и бесплатно.) - Надеюсь, они могут дать вам еще несколько приятных шагов. Даже когда они не учат самым передовым концепциям, они могут дать вам довольно хорошее представление о том, что есть и что это может быть полезно для.