2015-06-16 12 views
6

Wydaje się, że Frege może ocenićW jaki sposób Frege generalizuje literały liczbowe?

1/2 

aby zwrócić wartość podwójne 0.5.

Dosłowne 1 jest typu Int. Wydaje się być promowany do Double, który jest typem w klasie Real i dlatego zna operatora /. Jak to się stało? Czy używa on podejścia Haskella polegającego na cichej wymianie literału 1 na fromInt 1 lub czy dzieje się coś innego? Jak wybrać Double jako instancję z Real do użycia tutaj? Czy istnieje lista "domyślnych" typów instancji takich jak w Haskell?

+0

To bardzo dobre pytanie, ponieważ [oficjalna specyfikacja językowa] (http://www.frege-lang.org/doc/Language.pdf) nie wspomina o polimorfizmie literałów numerycznych.W języku Haskella literał ma typ 'Num a => a', który pozwala mu na wyspecjalizowanie się w jakimkolwiek typie liczbowym działającym w tym kontekście, może się zdarzyć, że magia podobnego typu dzieje się tutaj, ale nie mogłem się dowiedzieć na pewno w ciągu 5 minut, które spędziłem na szukaniu. – bheklilr

Odpowiedz

3

Proste literały dziesiętne bez wskaźnika typu (tj. Jednej z liter lndf) nie mają automatycznie typu Int w Freg.

Zostanie przypisany typ, który prawdopodobnie chciałeś, a literał zostanie odpowiednio dostosowany. Właśnie dlatego nazywa się je DWIM (rób co mam na myśli) literałami.

Jest to wymienione w dokumencie "Różnice w stosunku do Haskella". I oczywiście powinien to być również podręcznik do nauki języka. Jeśli jeszcze jej tam nie ma, to dlatego, że autor jest wyjątkowo leniwy.

W skrócie, DWIM działa w ten sposób: gdy sprawdzanie typu widzi literał za pierwszym razem, po prostu przypisuje mu zmienną typu plus ograniczenie Num dla tej zmiennej. Później, w drugim przebiegu, znajduje wszystkie literały DWIM. A teraz zmienna typu znajduje się w jednym z następujących stanów:

  1. jednolity z jakimś typem, np. Długi, podwójny lub podobny. Literał zostanie odpowiednio wpisany.
  2. Ujednolicona z innym typem: jest to błąd.
  3. Ujednolicona ze zmienną typu od podpisu typu: literał zostaje zastąpiony przez aplikację fromInt do literału wpisanego jako Int.
  4. Brak ujednolicenia: jeśli zmienna typu jest ograniczona przez (podtyp) Prawdziwy typ to Podwojenie w przeciwnym razie Int.

W twoim przykładzie literały są wpisywane jako podwójne z powodu ograniczenia Real operatora podziału.

Podobne podejście przyjmuje się w przypadku literałów z kropką dziesiętną, jednak zaczynają się one od ograniczenia Real i mogą w ten sposób skończyć jako Float lub Double lub z aplikacji Double.

Należy zauważyć, że oprócz przypadku 3 nie ma konwersji typu ani rzutowania typu w czasie wykonywania.

Powód, dla którego literały nie są przeważnie przeładowane, tak jak w Haskell, to unikanie niepotrzebnych ograniczeń klasowych, ponieważ ich implementacja prowadzi zwykle do kosztownego kodu. Ponadto, ponieważ nie mamy ograniczenia monomorfizmu, możesz mieć przypadkowe polimorficzne stałe. (Think fibs = 1: 1: ...)

W przypadku literałów DWIM otrzymuje się monomorficzne stałe i funkcje, chyba że wymaga się adnotacji typu.