4
我最初提出了我的函數作爲一個解決方案,其中myTakeWhile將(x:xs)的元素作爲列表返回,直到到達函數參數等於false的元素。之後提出了另一個解決方案,如下所示。使用摺疊使功能更優雅
myTakeWhile :: (a -> Bool) -> [a] -> [a]
myTakeWhile p [] = []
myTakeWhile p (x:xs) = if p x then x : myTakeWhile p xs else []
myTakeWhile :: (a -> Bool) -> [a] -> [a]
myTakeWhile p (x:xs) = foldr (\x acc -> if p x then x : acc else []) [] (x:xs)
我有過在我的腦海的褶皺一步一步,尤其是右側反直覺運行真正的麻煩倍,從下面我試圖測試列表的左側開始。
*Assignment1a> myTakeWhile (\x -> x `mod` 2 == 0) [1, 2, 3, 4, 5]
[]
*Assignment1a> myTakeWhile (\x -> x `mod` 2 == 0) [8, 10, 12, 1, 2, 3, 4, 5]
[8,10,12]
基本上我有點理解摺疊如何通過查看講義。然而,在上下文中的摺疊使我感到困惑,即使在咖啡因被刪除的情況下!我如何逐步理解這個摺疊?
偉大的答案,你能解釋一下foldr定義的最後一行是如何工作的嗎?我覺得這就是我努力抓住這一點的地方。 – Bradley 2014-11-05 14:11:17
@Bradley我試圖擴大這一點,並舉了另一個例子 - 這有幫助嗎? – Carsten 2014-11-05 14:33:06
它的確如此,謝謝! – Bradley 2014-11-05 16:37:39