Я пытался реализовать функциюПутаница выделки и безточечная в Haskell
every :: (a -> IO Bool) -> [a] -> IO Bool
который был темой для this question. Я попытался сделать это без явной рекурсии. Я придумал следующий код
every f xs = liftM (all id) $ sequence $ map f xs
Моя функция не работает, так как он не был ленив (что требовалось в вопросе), так что не upvotes там :-).
Однако я не останавливался на достигнутом. Я попытался сделать функцию точечной так, чтобы она была короче (и, возможно, даже более прохладной). Так как аргументы 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.
Почему это? У меня создалось впечатление, что можно просто отбросить аргументы аргументов, что в основном связано с карри.
Или вы можете использовать -XNoMonomorphismRestriction и отказаться от явного типа sig. –
Argh ... определение 'dot' выглядит так, как будто кто-то смотрит на меня. – gawi