ハスケルのfoldr
関数を勉強している間に、私はこのプログラムに出くわしました。私はそれがどのように実行されているのか理解できません。このHaskellプログラムの実行方法を理解するには?
mylength :: [Int] -> Int
mylength l = foldr f 0 l
where
f x y = y + 1
ハスケルのfoldr
関数を勉強している間に、私はこのプログラムに出くわしました。私はそれがどのように実行されているのか理解できません。このHaskellプログラムの実行方法を理解するには?
mylength :: [Int] -> Int
mylength l = foldr f 0 l
where
f x y = y + 1
この関数は、数値のリストで呼び出すと実行されます。 myLength [1,2,3]
は3
を返す必要があります。
foldr
には3つの引数があります。最初は関数です:ここはf
です。 2番目の値は開始値です。すべての値が返されるのと同じ型です。最後の引数は、折りたたむリストです。
foldr
作品(ちょっと)このように、関数f
はリストのすべての要素、最後の要素が最初に呼び出されます。最初はリストの最後の要素と呼ばれ、0
は1
を返します。それから、リストの最後から2番目の要素と前の呼び出しの結果である1
が呼び出されます。したがって、今度はf
の結果がリストの長さになります。リストの何も残っていないときは、それまでに累積された値(リストの長さ)を返します。
素敵な練習は、再帰的な定義で自分で折り畳みを書くことです。それはあなたがそれをよりよく理解するのに役立つかもしれません
実際にあなたの質問は「私はXを理解していません」と投票したので投票に投票しました。誰かを教育するためには、彼らがすでに知っていることを知っている必要があり、この状況では特に混乱していることがあります。 –
このような状況では、私はあなたが 'foldr'関数を理解していないと思います。だから、 'foldr'のソースコードを見て、それを理解してみてはどうでしょうか?一度それを持っていれば(またはそれを持っていなければ)、より具体的な質問をすることができます。 –
@ ThomasM.DuBuisson 'foldr'のソースコードは次のようになります: ' foldr ::(a - > b - > b) - > b - > ta - > b' 'foldr fzt = appEndo(foldMap() Endo#。f)t)z' 初心者はどのようにそれをどこから始めるべきか知っていますか? – Libby