хорошо, это определение функции фильтра с использованием 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])))
, и это будетbe
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.