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?

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.


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.


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-


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.