fmap und "flache Karte" in Haskell

8
Während all dieser Zeit, als irgendeine Haskell-Vorlesung von einer "flachen Karte" sprach, normalerweise in Bezug auf Monaden, dachte ich, dass sie aus einem Grund "flach" genannt wurde, d.h. sie flacht den Behälter ab. Also

%Vor%

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"?

    
trans 13.10.2016, 15:36
quelle

2 Antworten

20
  

Und wenn ja, warum hat f in fmap "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:

%Vor%

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?

%Vor%

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.

    
Alexis King 13.10.2016 16:36
quelle
1

Hier sind einige explizite Beispiele dafür, wie man flatMap in Haskell macht.

%Vor%

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).

    
dividebyzero 29.03.2017 20:50
quelle

Tags und Links