さて、これは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関数に入ります。上から見た関数内
の定義は次のとおりです。stepmyFilter
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ます。これは、であるため、次のようになります。2ys[3]
step 1 [3]
そして今x = 1、、、1は奇数なので、を返します。x : ysこれは1 : [3]、です[1,3]。
終わり :-)。
私はすべての動きで正しいですか?
どうもありがとう :-)。
psの定義は、第4章myFilterの本RealWorldHaskellからのものです。