Чтение о том, почему $
работает именно так, может привести к путанице. По сути, к чему сводится $
, можно легко объяснить в этом Ответе StackOverflow:
«Оператор $
предназначен для того, чтобы избежать круглых скобок. Все, что появится после него, будет иметь приоритет над всем, что будет раньше».
Достаточно просто. Однако понять, почему это работает именно так, может быть сложно. Итак, давайте разберемся.
Давайте посмотрим на его объявление типа. Мы можем увидеть объявление типа в ghci
, введя команду:info $
. Это сообщает нам, что объявление типа для $
:
(a -> b) -> a -> b
Что такое ghci?
GHC — это интерактивная среда, включающая интерактивный отладчик. Его можно скачать здесь.
По сути, операнд $
принимает функцию в качестве первого аргумента. Эта функция примет любой второй аргумент, который мы укажем, и даст нам результат, который может быть того же типа, но не обязательно.
Мы также получаем некоторую дополнительную информацию от ghci
, которая говорит нам, что $ является инфиксной функцией, которая является правоассоциативной с приоритетом 0.
(Подробнее об этом позже).
Ниже приведен пример того, что вы можете увидеть в ghci.
infixr 0 $ {- This just tells us that the $ is an infix function that is right associative as indicated by the letter r at the end of infix with the lowest precedence as indicated by the number 0 -}
Прежде чем мы пойдем дальше в понимании символа $
, нам нужно сначала понять несколько жизненно важных концепций.
Одна из первых вещей, которую нужно понять, — это термин "приложение-функция".
Применение функции — это процесс применения функции к ее аргументам. Например, в Haskell мы можем применить функцию add
к 2 аргументам.
add 5 5
В приведенном выше примере мы применяем воображаемую функцию add
к 2 аргументам, 5 и 5, чтобы получить результат 10.
Второе, с чем нам нужно познакомиться, — это инфиксные функции.
Инфиксные функции в Haskell — это функции, которые записываются между своими аргументами. Например, функция +
является инфиксной функцией в Haskell.
Мы используем функцию +
в Haskell для суммирования двух операндов. Например,
2 + 2
получится 4.
Третья вещь, с которой нам необходимо ознакомиться, — это приоритет.
Есть определенные операторы, которые имеют более высокий приоритет, чем другие. Возможно, вы помните термин P.E.M.D.A.S. из средней школы. Те же правила применяются в Haskell. Например, функция инфикса *
имеет более высокий приоритет, чем функция +
. Итак, когда мы оцениваем следующее выражение:
2 + 3 * 4
он оценивается как 14, поскольку инфиксная функция *
имеет более высокий приоритет, чем функция +
.
Haskell присваивает каждому операнду/выражению определенный уровень приоритета. Таблицу можно найти здесь
Последнее, с чем нам нужно познакомиться, — это термин ассоциативность.
Как правило, большинство функций оцениваются слева направо. Возьмем, к примеру
2 + 6 + 0
В приведенном выше примере сначала будет вычислено выражение 2+6
, а затем к нашей последней цифре 0
будет добавлена сумма 6 + 2. Даем нам результат 8.
Теперь, когда мы знаем все эти термины, мы можем начать понимать, как работает $
. Когда мы набрали command:info $
в нашем терминале, это дало нам некоторую полезную информацию. В нем говорилось, что $
была инфиксной функцией с самым низким приоритетом и правоассоциативной.
Итак, что это нам говорит?
Что ж, в Haskell пробелы вызывают приложения функций, которые имеют наивысший приоритет. Однако, когда мы вводим символ $
, функция слева превращается в аргумент для инфиксной функции $
. Кроме того, поскольку наша инфиксная функция является правоассоциативной, она будет сначала оценивать все справа, прежде чем передать что-либо нашей функции слева.
Рассмотрим этот пример:
addOne $ 2 * (3 + 4)
То же самое, но со скобками
addOne (2 * (3 + 4))
Обратите внимание, что мы не можем заменить последнюю скобку символом $
в нашем первом примере. Это потому, что если бы мы попытались, он попытался бы применить $
к инфиксной функции *
, что недопустимо. Если бы мы были настроены на замену скобок, мы могли бы преобразовать наши инфиксные функции в префиксную функцию и использовать тогда $
. См. пример ниже:
addOne $ (*) 2 $ (+) 3 4
Надеюсь, это помогло вам понять символ $
и то, почему вы иногда можете заменить скобки инфиксной функцией $
.
Вы идентифицируете себя как латиноамериканца и работаете в области искусственного интеллекта или знаете кого-то из латиноамериканца и работает в области искусственного интеллекта?
- Зарегистрируйтесь в нашем каталоге и станьте участником форума наших участников: https://forum.latinxinai.org/
- Станьте автором публикации LatinX in AI, написав нам по адресу [email protected].
- Узнайте больше на нашем сайте: https://www.latinxinai.org/
Не забудьте нажать 👏 ниже, чтобы поддержать наше сообщество — это очень много значит!
Спасибо :)