\
не является оператором, это часть буквального синтаксиса. Точнее, он является частью двух литеральных синтаксисов: он обозначает лямбда-литерал и служит в качестве escape-символа в строковых литералах.
Оператор $
определяется в прелюдии как
($) :: (a -> b) -> a -> b
f $ x = f x
Другими словами, он точно делает то же самое, что и пробельные символы, а именно простое приложение функции. Однако , в то время как применение функции является левоассоциативным и имеет высокий приоритет (фактически, самый высокий), $
является ассоциативным справа и имеет низкий приоритет.
Это позволяет вам опустить круглые скобки, когда у вас есть цепочки типа "f
, примененные к g
, примененные к h
, примененные к x
", которые без оператора $
будут записаны как
f (g (h x))
но с оператором можно записать как
f $ g $ h x
Это также полезно, если вы хотите передать сам оператор приложения функции в качестве аргумента другой функции. Скажем, у вас есть список функций и список значений, и вы хотите применить каждую функцию в списке к соответствующему значению в другом списке:
zipWith ($) fs xs