Я пытался реализовать функцию
every :: (a -> IO Bool) -> [a] -> IO Bool
который был темой для этого вопрос. Я попытался сделать это без явной рекурсии. Я придумал следующий код
every f xs = liftM (all id) $ sequence $ map f xs
Моя функция не сработала, так как она не была ленивой (что и требовалось в вопросе), поэтому никаких голосов там не было :-).
Однако на этом я не остановился. Я постарался сделать функцию безточечной, чтобы она была короче (а может, даже круче). Поскольку аргументы f
и xs
являются последними в выражении, я только что их отбросил:
every = liftM (all id) $ sequence $ map
Но это не сработало, как ожидалось, на самом деле это не сработало совсем:
[1 of 1] Compiling Main ( stk.hs, interpreted ) stk.hs:53:42: Couldn't match expected type `[m a]' against inferred type `(a1 -> b) -> [a1] -> [b]' In the second argument of `($)', namely `map' In the second argument of `($)', namely `sequence $ map' In the expression: liftM (all id) $ sequence $ map Failed, modules loaded: none.
Это почему? У меня создалось впечатление, что можно просто отбросить конечные аргументы функции, что в основном и есть в каррировании.