Überall, wo ich es versucht habe map
, fmap
hat es auch funktioniert. Warum hatten die Schöpfer von Haskell das Bedürfnis nach einer map
Funktion? Könnte es nicht einfach das sein, was derzeit bekannt ist fmap
und fmap
aus der Sprache entfernt werden könnte?
97
fmap
geht. Es dient zum Zuordnen einer Funktion zu einer Functor-Instanz. Ich frage mich über den Zweck der Spezialisierung aufmap
.Antworten:
Ich möchte eine Antwort geben, um auf Augustss 'Kommentar aufmerksam zu machen :
Haskell 98 wird von einigen Haskellern (einschließlich mir) als Rückschritt angesehen, da frühere Versionen eine abstraktere und konsistentere Bibliothek definiert haben. Naja.
quelle
map and fmap
gibt es schon lange - es wurde im August 2006 wieder auf die Haskell-Prime-Mailingliste gesetzt - haskell.org/pipermail/haskell-prime/2006-August/thread.html . Als Kontrapunkt bevorzuge ich den Status Quo. Für mich scheint es wertvoll, dass es eine Untergruppe von Haskell gibt, die in etwa Miranda entspricht. In Großbritannien wurde Miranda als Unterrichtssprache für Mathematikstudenten verwendet, nicht nur für Informatikstudenten. Wenn diese Nische nicht bereits für eine nicht funktionierende Sprache (z. B. Mathematica) verloren ist, sehe ich Haskell nicht mit einer einheitlichenmap
Füllung.Zitat aus der
Functor
Dokumentation unter https://wiki.haskell.org/Typeclassopedia#Functorquelle
Sie sehen auf der Anwendungsseite gleich aus, sind aber natürlich unterschiedlich. Wenn Sie eine dieser beiden Funktionen anwenden,
map
oderfmap
auf eine Liste von Werten , werden dieselben Ergebnisse erzielt. Dies bedeutet jedoch nicht, dass sie für denselben Zweck bestimmt sind.Führen Sie eine GHCI-Sitzung (Glasgow Haskell Compiler Interactive) aus, um Informationen zu diesen beiden Funktionen abzufragen. Schauen Sie sich dann deren Implementierungen an und Sie werden viele Unterschiede feststellen.
Karte
Fragen Sie GHCI nach Informationen zu ab
map
und Sie werden sehen, dass es als eine Funktion höherer Ordnung definiert ist, die auf eine Liste von Werten eines beliebigen Typs anwendbar ist und eine Liste von Werten eines beliebigen Typs
a
ergibtb
. Obwohl polymorph (diea
undb
in der obigen Definition stehen für jeden Typ), soll diemap
Funktion auf eine Liste von Werten angewendet werden, die nur ein möglicher Datentyp unter vielen anderen in Haskell ist. Diemap
Funktion konnte nicht auf etwas angewendet werden, das keine Werteliste ist.Wie Sie aus dem GHC.Base- Quellcode lesen können , ist die
map
Funktion wie folgt implementiertDabei wird der Mustervergleich verwendet, um den Kopf (den
x
) vom Ende (derxs
) der Liste abzuziehen. Anschließend wird eine neue Liste erstellt, indem der:
(cons) -Wertkonstruktor verwendet wird, um vorangestellt zu werdenf x
(lesen Sie ihn als "f auf x angewendet" ). zur Rekursionmap
über den Schwanz, bis die Liste leer ist. Es ist erwähnenswert, dass die Umsetzung dermap
Funktion nicht von einer anderen Funktion sondern nur von sich selbst.fmap
Versuchen Sie nun, Informationen zu abfragen,
fmap
und Sie werden etwas ganz anderes sehen.Diese Zeit
fmap
ist als eine der Funktionen definiert, deren Implementierungen von den Datentypen bereitgestellt werden müssen, die zurFunctor
Typklasse gehören möchten . Das bedeutet, dass es mehr als einen Datentyp geben kann, nicht nur den Datentyp "Liste der Werte" , der eine Implementierung für diefmap
Funktion bereitstellen kann. Dasfmap
gilt für einen viel größeren Datensatz: die Funktoren in der Tat!Wie Sie aus dem GHC.Base- Quellcode lesen können , ist eine mögliche Implementierung der
fmap
Funktion diejenige, die vomMaybe
Datentyp bereitgestellt wird :und eine andere mögliche Implementierung ist die, die durch den 2-Tupel-Datentyp bereitgestellt wird
und eine andere mögliche Implementierung ist die, die vom Listendatentyp bereitgestellt wird (natürlich!):
das hängt von der
map
Funktion ab.Fazit
Die
map
Funktion kann nur auf eine Liste von Werten angewendet werden (wobei Werte von einem beliebigen Typ sind), während diefmap
Funktion auf viel mehr Datentypen angewendet werden kann: alle, die zur Funktorklasse gehören (z. B. Maybes, Tupel, Listen usw.). ). Da der Datentyp "Werteliste" auch ein Funktor ist (weil er eine Implementierung dafür bereitstellt),fmap
kann er angewendet werden und liefert auch das gleiche Ergebnis wiemap
.quelle