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:
- jednolity z jakimś typem, np. Długi, podwójny lub podobny. Literał zostanie odpowiednio wpisany.
- Ujednolicona z innym typem: jest to błąd.
- Ujednolicona ze zmienną typu od podpisu typu: literał zostaje zastąpiony przez aplikację fromInt do literału wpisanego jako Int.
- 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.
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