好吧,这是使用 foldr 的过滤器函数的定义:
myFilter p xs = foldr step [] xs
where step x ys | p x = x : ys
| otherwise = ys
例如,假设我有这个功能:
myFilter odd [1,2,3,4]
所以它将是:
foldr step [] [1,2,3,4]
这将是
step 1 (foldr step [] [2,3,4])
这将是
step 1 (step 2 (foldr step [] [3,4]))
这将是
step 1 (step 2 (step 3 (foldr step [] [4])))
这将是
step 1 (step 2 (step 3 (step 4 (foldr step [] []))))
foldr step [] []是这样的[]:
step 1 (step 2 (step 3 (step 4 [])))
现在我们将真正进入step函数。
这是函数step内部的定义myFilter,从上面:
step x ys | p x = x : ys
| otherwise = ys
另外,我提醒您这p实际上是odd我们示例中的功能。
好吧,我们又来了:
step 1 (step 2 (step 3 (step 4 [])))
和
x = 4在最里面step,4并不奇怪,所以我们返回ys,即[]
所以现在我们得到了这个:
step 1 (step 2 (step 3 []))
现在,在最内在step的x = 3, 和3是奇数,所以我们返回x:ys,即3 : [],即[3],现在我们得到:
step 1 (step 2 [3])
现在,在内部step,x = 2和2不是奇数,所以我们返回ys,即[3],所以现在我们将得到:
step 1 [3]
现在,x = 1和1是奇数,所以我们返回x : ys,即1 : [3],即[1,3]。
结束 :-)。
我的所有动作都正确吗?
多谢 :-)。
ps 的定义myFilter来自《Real World Haskell 》一书第 4 章。