私はYAHT's Recursive Datatypeセクションから練習をしていましたが、listFoldr
関数を書くのはちょっと難しいです(主にfoldl
とfoldr
の違いを最初に理解していなかったからです)。 (これは、Haskell foldr関数を記述する正しい方法ですか?
listFoldl f i [] = i
listFoldl f i (x:xs) = listFoldl f (f i x) xs
listFoldr f i [] = i
listFoldr f i (x:xs) = listFoldr f (f x i) xs
これは動作するように表示されます。私は最終的にfoldr
機能が働いていた方法を正確に気づいたとき、私は、関数の引数のシンプルスワップはそれがlistFoldr
関数に私のlistFoldl
機能を変更するために必要なことと思いますすべてのだろうと決めました私が)これ以上のテストをしました:
Main> foldr (-) 4 [1, 2, 3]
-2
Main> listFoldr (-) 4 [1, 2, 3]
-2
しかし、運動のために与えられたsolutionは私よりもはるかに異なっています。彼らのlistFoldl
は私と全く同じであるが、そのlistFoldr
を見て:
listFoldr f i [] = i
listFoldr f i (x:xs) = f x (listFoldr f i xs)
良く、鉱山または彼らはどれソリューション?そのうちの1つは間違っていますか? (私のテストでは、両者はまったく同じ結果に終わります...)
ああ、私はそれをテストする悪い方法を選んだと思います。ありがとう! –
単純なテストは、 'listFoldr(:)" "" abc "'となります(newacctが述べたように 'listFoldr(:) []'はリストのアイデンティティ関数です) –