好吧,这是使用 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 章。