Warum gibt map ein zusätzliches Element zurück, wenn Bereiche in Haskell verwendet werden?

8

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:

%Vor%

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!

    
Vadik 02.09.2015, 23:45
quelle

1 Antwort

11

Dies liegt an der Implementierung von Enum für Float und Double :

%Vor%

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:

%Vor%

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.

>     
bheklilr 02.09.2015, 23:56
quelle

Tags und Links