我在YAHT 的 Recursive Datatype部分做练习,发现编写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
这似乎有效(我做了比这更多的测试):
Main> foldr (-) 4 [1, 2, 3]
-2
Main> listFoldr (-) 4 [1, 2, 3]
-2
但是为练习给出的解决方案与我的大不相同。他们listFoldl
和我的完全一样,但是看看他们的listFoldr
:
listFoldr f i [] = i
listFoldr f i (x:xs) = f x (listFoldr f i xs)
哪种解决方案更好,我的还是他们的?其中之一不正确吗?(在我的测试中,它们最终都得到完全相同的结果......)