さて、これは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の定義は、第4章myFilter
の本RealWorldHaskellからのものです。