2011-12-09 6 views
4

完全なHaskellの初心者ここでは、私の謝罪....私は別のシーケンスと生成された最後の値のうち、値のシーケンスを作成しようとしていますハスケル:私はリストモナドを改革していますか?

が(だから、私はマップを使用する方法を私に完全に明白ではありません)。

私はloop構造を使用しますが、これは基本的に再帰関数と同等です。だから、私は

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

の線に沿って再帰関数でこの問題を使用すると考えていたと私は、これはそれほど悪くはないと思います(実際の機能はもちろん、より複雑です...)しかし、私はモナドについて読ん(優秀なチュートリアルをPhilip Walderで読んでから、クロージャーのモナドに関するいくつかのものを読んでください)、私がここでそれらを使用するべきだという気持ちを助けることはできません。これまでのところ、モナドに関する私の知識は純粋に理論的なものであり、残念なことに、あなたが私を助けてくれれば非常に感謝しています。

+3

チェックアウト '本当に特化されmapAccumL'('と同等ですmapM'州のモナドで)。 – augustss

+1

私が正しく理解していれば、シーケンス生成プログラムの例では 'foldl 'で十分です:' reverse。 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

ありがとう@ランデイ!これは本当に私の問題を解決します。私はそれを少し複雑にしていたと思います。ボーナスの質問:最後のエントリも 'n'でこれを行う方法はありますか? – Paul

+0

@Paulそれがあなたが望んでいるかどうかは分かりませんが、 'scanl'が' foldl'に 'foldr'する' scanr'もあります。 'scanr(+)4 [60,70,80,90] - [304,244,174,94,4]です。 –

関連する問題