Jer*_*ten 1 haskell combinators fold
我是做从练习YAHT的递归数据类型部分时,发现写的listFoldr功能有点挑战性(主要是因为我真的不明白之间的差别foldl,并foldr在第一次).当我终于意识到foldr函数是如何工作的时候,我决定简单地交换函数参数就可以将我的listFoldl函数更改为listFoldr函数了:
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
Run Code Online (Sandbox Code Playgroud)
这似乎工作(我做了比这更多的测试):
Main> foldr (-) 4 [1, 2, 3]
-2
Main> listFoldr (-) 4 [1, 2, 3]
-2
Run Code Online (Sandbox Code Playgroud)
但是练习的解决方案与我的不同.他们listFoldl与我的完全一样,但看看他们listFoldr:
listFoldr f i [] = i
listFoldr f i (x:xs) = f x (listFoldr f i xs)
Run Code Online (Sandbox Code Playgroud)
哪种解决方案更好,我的还是他们的?其中一个是不正确的?(在我的测试中,他们都得到了完全相同的结果......)
你的解决方案绝对不正确.您只需实现一个foldl函数,该函数f以相反的顺序获取参数.例如,什么是错误,foldr (:) []应该是列表上的识别功能,但您的功能会反转列表.你的函数没有很多其他原因foldr,比如foldr无限列表的工作原理和你的无效.在你的例子中它们是相同的,这是纯粹的巧合,因为3 - (2 - (1 - 4)) == 1 - (2 - (3 - 4)).我认为你应该从头开始,看看foldr应该如何工作.