Как (-) может иметь два разных типа?

12

В ghci, когда я печатаю

:t (-)

чтобы выяснить тип (-), он возвращает

(-) :: Num a => a -> a -> a

Однако, когда я пишу, -1haskell возвращает число, которое, по-видимому, подразумевает, что оно (-)имеет тип Num a => a -> a. Как, (-)казалось бы, могут быть два разных типа?

TippFehler
источник

Ответы:

15

Это было дизайнерское решение на языке. -1является числом, но его использование в этом контексте не связано с функцией(-) . (Как Аккари упоминает в своем ответе, это использование связано с функцией negate.) Есть несколько компромиссов, которые позволяют это работать:

  1. Вы не можете взять правильный кусок (-)оператора. В качестве обходного пути Haskell предоставляет эту subtractфункцию.

  2. Вы не можете написать отрицательное целое число без скобок, если оно не находится в начале присваивания (например, сразу после =или ->). Это приводит к ошибке разбора:

    let x = 8 * -1

    Вместо этого это должно быть написано как

    let x = 8 * (-1)

    Тем не менее, это хорошо:

    let x = -1 * 8

Это считалось разумным компромиссом для разработчиков языка.

Эндрю Рэй
источник
8

Ответ уже descirbed в Haskell-вики , в нем говорится

Одинарный минус - это синтаксический сахар для функции Prelude negate

поэтому функция (-)всегда является a - bфункцией, и если вы напишите код, подобный let x = -yкомпилятору, она будет переведена в нее let x = negate y.

Ackdari
источник
7

Унарный минус особенный в Хаскеле. Как указано в разделе 3.4 Отчета :

Специальная форма обозначает префиксное отрицание, единственный префиксный оператор в Haskell, и является синтаксисом для . Бинарный оператор не обязательно ссылается на определение в Prelude; это может быть восстановлено модульной системой. Однако унарный всегда будет ссылаться на функцию, определенную в Prelude. Нет связи между локальным значением оператора и унарным отрицанием.-enegate (e)---negate-

bipll
источник
2
Ответы, состоящие из одного предложения, не рекомендуются для SO, так же как и ссылки без краткого изложения их содержания, поскольку они могут стать неработающими.
Эндрю Рэй
Как я могу предположить, что ссылки на отчеты / стандарты также сильно пессимизированы по сравнению с видео вики / учебники / YouTube?
bipll
@bipll Да. Проблема с ответами только для ссылок заключается не в качестве цели ссылки, а в вероятности гниения ссылок. Если вы скопировали в соответствующий раздел отчета, то ваш ответ будет в порядке.
Джозеф Сибл-Восстановить Монику