我在做YAHT's Recursive Datatype这个练习部分,发现编写listFoldr
函数有点难度(主要是因为我起初并没有真正理解foldl
和foldr
之间的区别)。当我终于实现完全foldr
功能是如何工作的,我决定函数参数的简单交换是一切会需要我listFoldl
功能更改为listFoldr
功能:这是编写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
这似乎工作(我没有比这更多的测试):
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)
哪种方案更好的,我的还是他们?他们中的一个是不正确的? (在我的测试中,他们最终都得到了完全相同的结果......)
啊我想我选择了一种不好的测试方式。谢谢! – 2009-05-16 05:32:16
一个简单的测试就是'listFoldr(:)“”“abc”'(如newacct提到的,'listFoldr(:) []'是列表的标识函数) – 2012-10-14 16:19:43