Zdarzyło mi się zobaczyć dziwne zachowanie podczas sprawdzania rozmiaru (minBound
, maxBound
) i "długość w układzie dziesiętnym" różnych typów integralnych.ghci - domyślne zamieszanie
Korzystanie GHCi:
Prelude> :{
Prelude| let mi = minBound
Prelude| ma = maxBound
Prelude| le = fromIntegral $ length $ show ma
Prelude| in [mi,ma,le] :: [Int]
Prelude| :}
[-9223372036854775808,922372036854775807,2]
^
na ostatnim miejscu chciałbym oczekiwać 19
.
Moje pierwsze przypuszczenie że maxBound
domyślnie ()
a tym samym daje 2
, ale nie rozumieją, że ponieważ ma
powinny być Int
przez adnotacją jawne typu (:: [Int]
) - i przez więzy przejrzystości wszystkich symboli nazwanych ma
powinny być równy.
Po umieszczeniu powyższego wyciągu w pliku i załadowaniu go do GHCi, otrzymuję poprawny wynik.
Dlaczego więc otrzymuję błędny wynik?
Myślę, że pierwsze przypuszczenie jest całkiem blisko, 'ma'” Typ s nie jest ustawiony na "Int" do późniejszego czasu, więc 'le' używa' ma :: Bounded a => a', które domyślnie '' '') w show. Jeśli zrobisz to ponownie za pomocą 'ma = maxBound :: Int', to powinno ci to dać 19. – jkeuhlen
jak to możliwe, że typ nie jest poprawiony? – epsilonhalbe
Każde zachowanie może być mylące, gdy spodziewasz się zachowania przeciwnego. –