würde genauso verarbeitet werden, als wäre es
%Vor%Aber jetzt entdecke ich, dass fmap und map grundsätzlich dasselbe sind, der einzige Unterschied ist die Anwendung eines für Funktoren und das andere für nur Listen. Und das wurde am Ende nur gemacht, um Fehlermeldungen bei der Verwendung von map zu vermeiden.
Stimmt das? Und wenn ja, warum wurde f
in fmap "flach", warum nicht "functor map"?
Und wenn ja, warum hat
f
infmap
"flach" gemeint, warum nicht "functor map"?
Ihre Intuition stimmt: Die f
in fmap
steht für "functor map", nicht für "flat map". In neueren, ähnlichen Sprachen wie PureScript ist der Name nur map
. Das Haskell map
wurde jedoch zuerst für Listen definiert, sodass es schwierig war, einen neuen Namen zu erstellen. Das Verwenden des F von Functor war eine einfache, wenn nicht besonders kreative Wahl.
Es ist wahrscheinlicher, dass sich der Dozent auf die monadische Bindefunktion >>=
bezieht. Aufgrund der Gleichwertigkeit von x >>= f
mit join (fmap f x)
wird bind in anderen Sprachen manchmal auch als flatMap
bezeichnet. Es hat das Verhalten, das Sie in Listen erwarten, zum Beispiel:
Es ist jedoch wichtig zu bedenken, dass diese "flache Karte" nicht rekursiv auf eine beliebige Tiefe abgeflacht wird. In der Tat ist das Schreiben einer solchen Funktion in Haskell ohne eine komplizierte Typenklassentrickerei nicht wirklich möglich. Probieren Sie es selbst aus: Wie würde die Typ-Signatur für eine flatten
-Funktion aussehen, selbst wenn sie direkt auf Listen operiert?
Die Funktion >>=
ist im Vergleich sehr einfach: Sie ist wie fmap
, aber jedes Ausgabeelement muss in den Funktor eingeschlossen werden, und >>=
"flacht" die Ergebnisse flach in einen einzigen Wrapper. Diese Operation ist die Essenz dessen, was eine Monade ist, weshalb die Funktion >>=
in der Klasse Monad
, aber fmap
in Functor
lebt.
Diese Antwort wurde einigen Kommentaren zu der ursprünglichen Frage entnommen, daher habe ich sie als Community-Wiki markiert. Änderungen und Verbesserungen sind willkommen.
Hier sind einige explizite Beispiele dafür, wie man flatMap
in Haskell macht.
Es sollte klar sein, dass flatMap
Map zuerst ist und dann flach, Sie reduzieren die Ausgabe der Map, im Gegensatz zur Verflachung der Eingabeliste, die Sie gerade bearbeiten wollen (das ist nicht flatMap
, das hat keine Name, es ist nur eine Wohnung und dann map).
Tags und Links haskell