Я просто не могу понять волшебство, которое Haskell делает с этим вариантом использования filterM
. Исходный код для этой функции приведен ниже:
filterM :: (Monad m) => (a -> m Bool) -> [a] -> m [a]
filterM _ [] = return []
filterM p (x:xs) = do
flg <- p x
ys <- filterM p xs
return (if flg then x:ys else ys)
В этом случае p
должна быть лямбда-функцией (\x -> [True, False])
, а первая x
должна быть 1
. Итак, что возвращает flg <- p x
? Что такое значение flg
для каждой рекурсии?