Haskell: я заново изобретаю монаду списка? - PullRequest
4 голосов
/ 09 декабря 2011

Полный новичок Хаскелла здесь, мои извинения ....

Я пытаюсь создать последовательность значений из другой последовательности и последнего сгенерированного значения (поэтому для меня не совсем очевидно, как бы я использовал map).

В clojure я бы использовал конструкцию loop, которая в основном эквивалентна рекурсивной функции. Поэтому я подумал, что смогу использовать эту проблему с рекурсивной функцией в соответствии с

genSequence :: [a] -> [b] -> [a]
genSequence result [] = reverse result
genSequence a:as b:bs = genSequence ((computeNextA a b):a:as) bs

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

1 Ответ

4 голосов
/ 09 декабря 2011

Не уверен, поможет ли это, но что-то вроде (при условии, что computeNextA равно +)

genSequence [4] [60,70,80,90]
--[4,64,134,214,304]

эквивалентно

scanl (+) 4 [60,70,80,90]
--[4,64,134,214,304]
...