2013-02-22 1 views

Antwort

6

Es hat mit der Tatsache zu tun, dass

enumFromThenTo 1.0 3.0 0.0 

zu [1.0] auswertet. Die Spezifikation enumFromThenTo für Floats finden Sie in Abschnitt 6.3.4 von http://www.haskell.org/onlinereport/haskell2010/haskellch6.html.

+2

Zum Erhöhen der Gleitkommazahl bleibt [a, b .. c] solange aktiv, bis die Zahlen c + (b-a)/2,0 überschreiten. Zum Beispiel ist [1.0, 2.0 .. 4.0] [1.0, 3.0, 5.0]. –

+0

Was ist in Ihrem Beispiel mit 2.0 und 4.0 passiert? –

+0

@ Code-Guru. Mea culpa. Ich meinte [1.0, 3.0 .. 4.0]. Vielen Dank. –

7

Zuerst änderte ich den Namen Ihrer ersten t2s zu t1s, so dass ich sie beide in Ghci zur gleichen Zeit geladen haben kann. Schauen Sie sich die abgeleiteten Typen für jeden von ihnen:

[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> 

Beachten Sie, dass t1s nimmt Fractional Argument während t2s eine Num nimmt. Dies bedeutet, dass in t1s 0 die 0 als Double gewertet wird. Der Interpreter wiederum gibt 0 als Integer in t2s 0 an. Da der für das Argument verwendete Typ unterschiedlich ist, kann das Verhalten auf sehr überraschende Weise variieren. Insbesondere sollten Sie sicher sein, nur Integral Typen zu verwenden, wenn Sie eine Liste wie in [1,3..n] auflisten.

Um dies zu beheben, müssen Sie nur explizite Typ-Signaturen für beide Funktionen bereitstellen.

+3

Säumige Streiks wieder! Im Wesentlichen findet die Typinferenz den allgemeinsten Typ. Das Problem ist, dass numerische Literale überladen sind, so dass ein Ausdruck wie 't2s 0' mehrdeutig ist - er kann für einen * beliebigen * numerischen Typ gelten! Da Unklarheiten wie diese häufig sind und wir Haskell wie einen Taschenrechner verwenden möchten, haben wir einen hacky Weg damit umzugehen: [defaulting] (http://www.haskell.org/onlinereport/decls.html#sect4 .3.4). Im Wesentlichen versuchen wir zuerst "Integer" und dann "Double" für solche Ausdrücke. Vielleicht möchten Sie etwas in Ihrer Antwort bearbeiten. –

+0

@TikhonJelvis Ich bin ein Haskell-Neuling und wusste nichts über das Säumnis, bis Sie diesen Kommentar gepostet haben. Meine Antwort hier kam einfach aus dem Code des OP gehackt, weil ich neugierig auf die Unterschiede war. Ich habe die Typunterschiede gefunden, als ich durch die Auswertung gegangen bin. –

+0

Es ist eine gute Zeit, darüber zu lernen, wie jeder :). Ich habe zuerst darüber gelesen, als ich eine SO-Frage beantwortete. Genau so habe ich eine ganze Reihe von Leckerbissen aufgeschnappt. –