2017-02-12 13 views
-3

ハスケルのfoldr関数を勉強している間に、私はこのプログラムに出くわしました。私はそれがどのように実行されているのか理解できません。このHaskellプログラムの実行方法を理解するには?

mylength :: [Int] -> Int 
mylength l = foldr f 0 l 
    where 
    f x y = y + 1 
+0

実際にあなたの質問は「私はXを理解していません」と投票したので投票に投票しました。誰かを教育するためには、彼らがすでに知っていることを知っている必要があり、この状況では特に混乱していることがあります。 –

+0

このような状況では、私はあなたが 'foldr'関数を理解していないと思います。だから、 'foldr'のソースコードを見て、それを理解してみてはどうでしょうか?一度それを持っていれば(またはそれを持っていなければ)、より具体的な質問をすることができます。 –

+0

@ ThomasM.DuBuisson 'foldr'のソースコードは次のようになります: ' foldr ::(a - > b - > b) - > b - > ta - > b' 'foldr fzt = appEndo(foldMap() Endo#。f)t)z' 初心者はどのようにそれをどこから始めるべきか知っていますか? – Libby

答えて

2

この関数は、数値のリストで呼び出すと実行されます。 myLength [1,2,3]3を返す必要があります。

foldrには3つの引数があります。最初は関数です:ここはfです。 2番目の値は開始値です。すべての値が返されるのと同じ型です。最後の引数は、折りたたむリストです。

foldr作品(ちょっと)このように、関数fはリストのすべての要素、最後の要素が最初に呼び出されます。最初はリストの最後の要素と呼ばれ、01を返します。それから、リストの最後から2番目の要素と前の呼び出しの結果である1が呼び出されます。したがって、今度はfの結果がリストの長さになります。リストの何も残っていないときは、それまでに累積された値(リストの長さ)を返します。

素敵な練習は、再帰的な定義で自分で折り畳みを書くことです。それはあなたがそれをよりよく理解するのに役立つかもしれません

+2

実際には、 'foldr'の中で' 0'と一緒に使用されるリストの最後の要素です。ここで 'f'は' 1'を返します。それから、最後に2番目に「1」があり、「2」が生成されます。等々。 – chi

+0

ハ、これは私が夜中にそうしようとするべきではない理由です。ありがとう。 – Libby

+0

私を助けてくれてありがとうLIbby今私はfoldr関数のより良い理解を持って、これはstackoverflowの私の最初の質問だったと私は正直言って私のような初心者のために悲しかった4 downvotesを得た。たぶん私の質問が愚かだったので起こった –

関連する問題