Определение $ равно
f $ x = f x
Давайте полностью заключим в скобки вашу функцию:
every f xs = (liftM (all id)) (sequence ((map f) xs))
и ваша версия с карри:
every = (liftM (all id)) (sequence map)
Как вы заметили, они не идентичны. Вы можете отбросить аргументы завершающей функции только тогда, когда они применяются последним. Например,
f x = g c x
на самом деле
f x = (g c) x
и применение (g c) к x идет последним, так что вы можете написать
f = g c
Один шаблон с оператором приложения $ состоит в том, что он часто становится оператором композиции. в бессчетной версии. Это потому что
f $ g $ x
эквивалентно
(f . g) $ x
Например,
every f xs = liftM (all id) $ sequence $ map f xs
может стать
every f xs = (liftM (all id) . sequence . map f) xs
в этот момент вы можете сбросить xs:
every f = liftM (all id) . sequence . map f
Устранить аргумент f сложнее, потому что он применяется перед оператором композиции. Давайте использовать определение точки от http://www.haskell.org/haskellwiki/Pointfree:
dot = ((.) . (.))
С точками это
(f `dot` g) x = f . g x
и это именно то, что нам нужно, чтобы каждые полные очки были свободны:
every = (liftM (all id) . sequence) `dot` map
К сожалению, из-за ограничений в системе типов Haskell, для этого требуется явная подпись типа:
every :: (Monad m) => (a -> m Bool) -> [a] -> m Bool