Я плохо знаком с Haskell, и эта смесь Инфиксной и Префиксной нотации смущает меня. Каково различие между оператором как '+' и функцией как голова? Как я пишу оператор 'c', который делает этот 1 c 1 = 2?
Я нашел это определение a! b = Верный. Как делает Haskell, знают, что я определяю! и не функция a?
В Haskell для создания оператора вы должны использовать следующие «символы оператора»:
! # $% * +. / <=>? \ ^ | : - ~
Так, например,
($$$) a b = a+b
Определяет оператор $$$, который можно использовать в выражении 1 $$$ 1, чтобы получить значение 2.
Концептуально нет разницы между операторами и функция, и вы можете использовать обратные кавычки или скобки, чтобы одна работала как другая.
РЕДАКТИРОВАТЬ:
Чтобы это было на 100% ясным, позвольте мне продемонстрировать превращение функции в оператор и наоборот:
Для оператора '+' следующие два выражения эквивалентны:
1+1
(+) 1 1
Аналогично для функции следующие два выражения эквивалентны:
foo 1 2
1 `foo` 2
На самом деле, разница только в синтаксисе. Имена функций начинаются с строчной буквы, за которой следует серия буквенно-цифровых символов. Операторы - это некоторая уникальная последовательность типичных символов операторов (+ - / * <> и т. Д.).
Функции могут использоваться как операторы (in-fix), заключая имя функции в символы `. Например:
b = x `elem` xs -- b is True if x is an element in xs.
Операторы можно использовать как функции (предварительное исправление), заключив оператор в скобки. Например:
n = (+) 2 5 -- n = 2 + 5, or 7.
Haskell знает, что вы не определяете функцию с именем a
, потому что !
недопустимо в списке аргументов функции. Чтобы использовать !
не как оператор, а как обычный идентификатор, вы должны заключить его в круглые скобки. Если вместо этого вы напишете a (!) B = True
, тогда будет определена функция a :: t -> t1 -> Bool
.
В этом вся разница между операторами и обычными идентификаторами в Haskell - существуют специальные правила синтаксиса для операторов, которые позволяют использовать их инфиксно без обратных кавычек. В противном случае это просто функции.