2011-12-09 27 views
4

完整的哈斯克尔新手在这里,我的歉意....Haskell:我是否在重塑Monad Monad?

我想创建一个序列的值出另一个序列和最后一个值生成(所以它不是完全明显的我将如何使用地图)。

在clojure中,我会使用一个loop构造,它基本上等同于递归函数。所以我想,我可以用这个问题,沿着

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

行递归函数,我想这是没有那么糟糕(真正的功能当然是更复杂...),但我读到单子(请阅读Philip Walder的优秀教程,然后介绍clojure中monad的一些内容),并且无法帮助我在这里使用它们的感觉。不幸的是,迄今为止,我对monads的理解纯属理论上的,所以如果你能帮助我,我将非常感激。

+3

退房'mapAccumL'(这实在是一个专门的'mapM'在国家monad)。 – augustss

+1

如果我正确理解你,'foldl'就足够你的序列生成器的例子:'反向。 foldl'(\ a x - > computeNextA(head a)x:a)listA $ listB' –

+0

@augustss会这样做,谢谢。事实证明,我不会在这里需要它... – Paul

回答

4

不知道这是否会有所帮助,但类似(假设computeNextA+

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

相当于

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

谢谢@Landei!这确实解决了我的问题..我想我已经过了一些复杂化。奖金问题:有没有办法通过'n'最后一个条目来做到这一点? – Paul

+0

@Paul不知道这是你想要的,但也有'scanr',它是'foldr'什么'scanl'是'foldl'。 '扫描仪(+)4 [60,70,80,90] - [304,244,174,94,4]'。 –