Як (-), здавалося б, може мати два різні типи?


12

У ghci, коли я набираю

:t (-)

щоб з'ясувати тип (-), він повертається

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

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

Відповіді:


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.


7

Одинарний мінус особливий у Хаскелла. Як зазначено в розділі 3.4 Звіту :

Спеціальна форма позначає заперечення префікса, єдиного оператора префікса в Haskell і є синтаксисом для . Двійковий оператор не обов'язково посилається на визначення в Прелюдії; він може відскочити модульною системою. Однак унар завжди буде посилатися на функцію, визначену в прелюдії. Не існує зв'язку між локальним значенням оператора та одинарним запереченням.-enegate (e)---negate-


2
Відповіді на одне речення відмовляються від SO, як і посилання без зведення їх змісту, оскільки вони можуть бути зламані.
Ендрю Рей

Як я можу припустити, що посилання на звіти / стандарти також сильно песимізовані порівняно з відео вікі / підручниками / ютубами?
bipll

@bipll Так. Питання з відповідями лише на посилання - це не якість цілі посилання, а швидше ризик гниття посилання. Якщо ви скопіювали у відповідний розділ звіту, то ваша відповідь буде добре.
Джозеф Сибл-Відновити Моніку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.