Каково различие между оператором и функцией в Haskell?

Я плохо знаком с Haskell, и эта смесь Инфиксной и Префиксной нотации смущает меня. Каково различие между оператором как '+' и функцией как голова? Как я пишу оператор 'c', который делает этот 1 c 1 = 2?

Я нашел это определение a! b = Верный. Как делает Haskell, знают, что я определяю! и не функция a?

5
задан Don Stewart 18 April 2011 в 22:56
поделиться

3 ответа

В Haskell для создания оператора вы должны использовать следующие «символы оператора»:

! # $% * +. / <=>? \ ^ | : - ~

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

($$$) a b = a+b

Определяет оператор $$$, который можно использовать в выражении 1 $$$ 1, чтобы получить значение 2.

Концептуально нет разницы между операторами и функция, и вы можете использовать обратные кавычки или скобки, чтобы одна работала как другая.

РЕДАКТИРОВАТЬ:

Чтобы это было на 100% ясным, позвольте мне продемонстрировать превращение функции в оператор и наоборот:

Для оператора '+' следующие два выражения эквивалентны:

1+1
(+) 1 1

Аналогично для функции следующие два выражения эквивалентны:

foo 1 2
1 `foo` 2
17
ответ дан 18 December 2019 в 05:55
поделиться

На самом деле, разница только в синтаксисе. Имена функций начинаются с строчной буквы, за которой следует серия буквенно-цифровых символов. Операторы - это некоторая уникальная последовательность типичных символов операторов (+ - / * <> и т. Д.).

Функции могут использоваться как операторы (in-fix), заключая имя функции в символы `. Например:

b = x `elem` xs -- b is True if x is an element in xs.

Операторы можно использовать как функции (предварительное исправление), заключив оператор в скобки. Например:

n = (+) 2 5 -- n = 2 + 5, or 7.
5
ответ дан 18 December 2019 в 05:55
поделиться

Haskell знает, что вы не определяете функцию с именем a , потому что ! недопустимо в списке аргументов функции. Чтобы использовать ! не как оператор, а как обычный идентификатор, вы должны заключить его в круглые скобки. Если вместо этого вы напишете a (!) B = True , тогда будет определена функция a :: t -> t1 -> Bool .

В этом вся разница между операторами и обычными идентификаторами в Haskell - существуют специальные правила синтаксиса для операторов, которые позволяют использовать их инфиксно без обратных кавычек. В противном случае это просто функции.

6
ответ дан 18 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: