Ich habe gerade angefangen, Haskell zu lernen und habe eine seltsame Sache gefunden.
Lass uns eine Liste haben:
%Vor% Es hat 3 Elemente. Wenn ich map
mit dieser Liste verwende, bekomme ich 3 Elemente als Ausgabe, zum Beispiel:
Aber wenn ich eine Teilungsunterteilung verwende, bekomme ich 4 Elemente in der Ausgabeliste:
%Vor% Könnten Sie bitte erklären, warum map
möglicherweise mehr Elemente zurückgibt, als es war?
Danke!
Dies liegt an der Implementierung von Enum
für Float
und Double
:
Es geht nicht map
, sondern Float
. Insbesondere wenn Sie enumFromThenTo 0 2 5 :: [Float]
aufrufen, erhalten Sie dieselbe Liste. Sie sehen die gleichen Ergebnisse für Double
.
Dies ist in dem Haskell-Bericht angedeutet, aber das Verhalten ist definitiv nicht -offensichtlich. Im Wesentlichen kommt es auf die Implementierung von numericEnumFromThenTo
an (wir gehen hier auf einige Haskell-Interna ein), die von der Enum Float
-Instanz verwendet werden:
Sie haben numericEnumFromThen 0.0 2.0
also die Liste [0.0,2.0,4.0,6.0,8.0,...]
generiert, dann takeWhile p
, was in diesem Fall der Funktion \x -> x <= 5.0 + (2.0 - 0.0) / 2
oder einfacher \x -> x <= 6.0
entspricht, weshalb 6.0
ist in der Ausgabeliste von [0.0,2.0..5.0]
enthalten.
Ich kann nicht erklären, warum es auf diese Weise implementiert wird, das ist auch ziemlich verwirrend für mich, aber hoffentlich habe ich die wie für ihre Implementierung beantwortet.
>