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