Przede wszystkim zmieniłem nazwę pierwszego t2s
na , aby móc załadować oba jednocześnie do ghci. Spójrz na uzyskanymi typów dla każdego z nich:
[ts.hs:2:1-33] *Main> :t t1s
t1s :: (Enum t, Fractional t) => t -> [t]
[ts.hs:2:1-33] *Main> :t t2s
t2s :: (Enum t, Num t) => t -> [t]
[ts.hs:2:1-33] *Main>
Zauważ, że t1s
zajmuje Fractional
argumentu natomiast t2s
zajmuje Num
. Oznacza to, że w t1s 0
, 0
jest rozumiane jako Double
. Z drugiej strony interpreter podaje 0
, aby być Integer
w t2s 0
. Ponieważ rodzaj używany do argumentu różni się, zachowanie może się różnić w bardzo zaskakujący sposób. W szczególności należy pamiętać o używaniu tylko typów Integral
podczas wymieniania listy, jak w przypadku [1,3..n]
.
Aby to naprawić, wystarczy podać jawne podpisy typów dla obu funkcji.
W celu zwiększenia wartości liczb zmiennoprzecinkowych, [a, b..c] kontynuują działanie, dopóki liczby nie przekroczą c + (b-a) /2,0. Na przykład [1.0, 2.0 .. 4.0] to [1.0, 3.0, 5.0]. –
Co stało się z 2.0 i 4.0 w twoim przykładzie? –
@ Code-Guru. Mea culpa. Miałem na myśli [1.0, 3.0 .. 4.0]. Dzięki. –