Was ist der Punkt der Karte in Haskell, wenn es fmap gibt?
Überall ich habe versucht, mit map
fmap
hat auch funktioniert. Warum haben die Macher von Haskell fühlen sich die Notwendigkeit für eine map
Funktion? Konnte es nicht einfach so sein, wie wir Sie derzeit kennen fmap
und fmap
entfernt werden konnten, aus der Sprache?
InformationsquelleAutor der Frage Clark Gaebel | 2011-07-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde gern eine Antwort auf sich aufmerksam zu augustss Kommentar:
Haskell 98 versteht sich als ein Schritt rückwärts, indem Sie einige Haskellers (mich eingeschlossen), frühere Versionen nach der Definition einer abstrakten und konsistenten Bibliothek. Naja.
InformationsquelleAutor der Antwort luqui
Zitat aus dem
Functor
Dokumentation https://wiki.haskell.org/Typeclassopedia#FunctorInformationsquelleAutor der Antwort Andrei Bozantan
Sehen Sie das gleiche auf der Anwendung Website, aber Sie sind natürlich anders. Wenn Sie eine der beiden Funktionen
map
oderfmap
um eine Liste der Werte, für die diese produzieren das gleiche Ergebnis, aber das bedeutet nicht, dass Sie gemeint sind, für den gleichen Zweck.Führen Sie eine GHCI-session (der Glasgow Haskell Compiler Interactive viewing), um eine Abfrage nach Informationen zu diesen beiden Funktionen, dann haben Sie einen Blick auf Ihre Implementierungen und entdecken Sie viele Unterschiede.
Karte
Abfrage GHCI für Informationen über
map
und du wirst es sehen, definiert als high-order-Funktion für eine Liste von Werten eines beliebigen Typs
a
woraus sich eine Liste von Werten eines beliebigen Typsb
. Obwohl polymorph (diea
undb
in der obigen definition stehen für jede Art) diemap
Funktion soll angewendet werden, um eine Liste der Werte das ist nur eine mögliche Datentyp unter vielen anderen in Haskell. Diemap
- Funktion kann nicht angewendet werden auf etwas, das ist nicht eine Liste von Werten.Wie Sie Lesen können, von der GHC.Base source-code, der
map
Funktion ist wie folgt implementiertmacht die Verwendung von pattern matching zu ziehen, der Kopf (
x
) den Schwanz ab (derxs
) von der Liste, dann erstellt eine neue Liste mit den:
(Nachteile) Wert-Konstruktor so voranstellenf x
(Lesen Sie es als "f angewandt auf x"), um die Rekursionmap
über den Schwanz, bis die Liste leer ist. Es lohnt sich zu bemerken, dass die Umsetzung dermap
- Funktion wirkt sich nicht auf jede andere Funktion, die aber nur auf sich selbst.fmap
Nun versuchen, eine Abfrage nach Informationen zu
fmap
und du wirst sehen, etwas ganz anderes.Dieser Zeit
fmap
ist definiert als eine der Funktionen, deren Implementierung bereitgestellt werden muss, durch diejenigen, die Daten-Typen, die wollen, gehören zu denFunctor
Typ-Klasse. Das bedeutet, dass es kann mehr als einen Datentypen, nicht nur die "Liste der Werte" Daten-Typ, in der Lage, stellen Sie eine Implementierung für diefmap
Funktion. Das machtfmap
anwendbar um eine viel größere Anzahl von Daten-Typen: die funktoren in der Tat!Wie Sie Lesen können, von der GHC.Base Quellcode, eine mögliche Implementierung der
fmap
Funktion ist die von derMaybe
Daten Typ:und andere mögliche Implementierung ist die von der 2-Tupel-Datentyp
und andere mögliche Implementierung ist die von der Liste Datentyp (natürlich!):
die sich auf die
map
- Funktion (beachten Sie den Punkt-free-notation gibt ... aber das ist außerhalb des Rahmens Ihrer ursprünglichen Frage).Fazit
Den
map
Funktion kann angewendet werden, um nichts mehr als Liste von Werten (in denen Werte eines beliebigen Typs) in der Erwägung, dass diefmap
Funktion angewendet werden kann, viel mehr Datentypen: alle diejenigen, die gehört zu der functor-Klasse (z.B. maybes, Tupel, Listen, etc.). Da die "Liste der Werte" Datentyp auch einen Funktor ist (denn es stellt eine Implementierung für es), dannfmap
angewendet werden kann, wie auch produziert das gleiche Ergebnis wiemap
.InformationsquelleAutor der Antwort Paolo Angioletti