我在做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