W jaki sposób (-) pozornie mogą mieć dwa różne typy?

12

W ghci, kiedy piszę

:t (-)

aby dowiedzieć się, jaki typ (-), zwraca

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

Jednak kiedy piszę, -1haskell zwraca liczbę, co wydaje się sugerować, że (-)jest typu Num a => a -> a. Jak (-)pozornie mogą mieć dwa różne typy?

TippFehler
źródło

Odpowiedzi:

15

To była decyzja projektowa w języku. -1jest liczbą, ale jego użycie w tym kontekście nie(-) jest powiązane z funkcją . (Jak wspomina Ackdari w swojej odpowiedzi, to użycie jest związane z funkcją negate.) Istnieje kilka kompromisów, które pozwalają na to:

  1. Nie możesz wziąć prawego wycinka (-)operatora. Jako obejście problemu Haskell udostępnia tę subtractfunkcję.

  2. Nie można zapisać ujemnej liczby całkowitej bez nawiasów, chyba że jest ona na początku przypisania (np. Bezpośrednio po =lub ->). To powoduje błąd analizy:

    let x = 8 * -1

    Zamiast tego należy zapisać jako

    let x = 8 * (-1)

    Jest to jednak w porządku:

    let x = -1 * 8

Uznano je za rozsądne kompromisy dla projektantów języka.

Andrew Ray
źródło
8

Odpowiedź jest już descirbed w Haskell-wiki , stwierdza

Unarny minus to cukier składniowy dla funkcji Preludium negate

więc funkcja (-)jest zawsze a - bfunkcją i jeśli napiszesz kod taki jak let x = -ykompilator, przetłumaczy go let x = negate y.

Ackdari
źródło
7

Jednoargumentowy minus jest szczególny w Haskell. Jak stwierdzono w sekcji 3.4 raportu :

Specjalna forma oznacza negację prefiksu, jedynego operatora prefiksu w Haskell i jest składnią dla . Operator binarny niekoniecznie odnosi się do definicji w Preludium; może zostać odbity przez system modułów. Jednak unary zawsze będą odnosić się do funkcji zdefiniowanej w Preludium. Nie ma związku między lokalnym znaczeniem operatora a jednoznaczną negacją.-enegate (e)---negate-

bipll
źródło
2
Odpowiedzi na jedno zdanie są odradzane na SO, podobnie jak linki bez streszczenia ich treści, ponieważ mogą zostać uszkodzone.
Andrew Ray
Jak mogę założyć, że linki do raportów / standardów są również bardzo pesymizowane w porównaniu do stron wiki / samouczków / filmów z YouTube?
bipll
@bipll Tak. Problem z odpowiedziami opartymi tylko na linkach nie dotyczy jakości celu linków, ale ryzyko zepsucia linków. Jeśli skopiowałeś w odpowiedniej części raportu, odpowiedź byłaby w porządku.
Joseph Sible-Reinstate Monica