Вопрос о двух символах haskell и о том, что они делают: $ и \ - PullRequest
1 голос
/ 08 апреля 2011

Может ли кто-нибудь объяснить мне простыми словами, что делают эти два оператора:

$

\

Ответы [ 3 ]

15 голосов
/ 08 апреля 2011

\ не является оператором, это часть буквального синтаксиса. Точнее, он является частью двух литеральных синтаксисов: он обозначает лямбда-литерал и служит в качестве escape-символа в строковых литералах.

Оператор $ определяется в прелюдии как

($) :: (a -> b) -> a -> b
f $ x = f x

Другими словами, он точно делает то же самое, что и пробельные символы, а именно простое приложение функции. Однако , в то время как применение функции является левоассоциативным и имеет высокий приоритет (фактически, самый высокий), $ является ассоциативным справа и имеет низкий приоритет.

Это позволяет вам опустить круглые скобки, когда у вас есть цепочки типа "f, примененные к g, примененные к h, примененные к x", которые без оператора $ будут записаны как

f (g (h x))

но с оператором можно записать как

f $ g $ h x

Это также полезно, если вы хотите передать сам оператор приложения функции в качестве аргумента другой функции. Скажем, у вас есть список функций и список значений, и вы хотите применить каждую функцию в списке к соответствующему значению в другом списке:

zipWith ($) fs xs
7 голосов
/ 08 апреля 2011

что делают эти два оператора: $ \

Первый, ($), является оператором, определяемым как:

-- | Application operator.  This operator is redundant, since ordinary
-- application @(f x)@ means the same as @(f '$' x)@. However, '$' has
-- low, right-associative binding precedence, so it sometimes allows
-- parentheses to be omitted; for example:
--
-- >     f $ g $ h x  =  f (g (h x))
--
-- It is also useful in higher-order situations, such as @'map' ('$' 0) xs@,
-- or @'Data.List.zipWith' ('$') fs xs@.

($)                     :: (a -> b) -> a -> b
f $ x                   =  f x

Это позволяет вамписать функции с меньшим количеством скобок.

Второй токен \ является частью синтаксиса Haskell для лямбда-абстракций - анонимных функций.

Так, например,

\x -> x + 1

- это функция, которая добавляет 1 к своему аргументу.Синтаксис лямбда-абстракций описан в отчете Haskell .

2 голосов
/ 08 апреля 2011

($) :: (a -> b) -> a -> b base Prelude, base Data.Function Оператор приложения.Этот оператор является избыточным, поскольку обычное приложение (fx) означает то же самое, что и (f $ x).Тем не менее, $ имеет низкий приоритет связывания справа, поэтому иногда допускается пропуск круглых скобок;

ключевое слово \ Обратная косая черта "\" используется в многострочных строках> "foo \> \ bar"> в лямбда-выражениифункции>> \ x -> x + 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...