Krautkanal.com

Veröffentlicht am 2015-07-27 14:46:23 in /prog/

/prog/ 7482: Monaden

dwardt Avatar
dwardt:#7482

Hallo Bernd,

ich denke ich habe die Grundlagen in Haskell größtenteils verstanden. Auch verstehe ich, dass Monaden einen Kontext wrappen und man damit so etwas wie Zustände erreichen kann. Jedoch weiß ich immer noch nicht wie und wo Monaden (abgesehen von der IO-Monade) am besten zum Einsatz kommen. Hast du vielleicht ein paar gute Beispiele für mich, in denen Monaden tatsächen praktisch benutzt werden? Ich finde bislang immer nur die gleichen Beispiele und diese bringen mich nicht wirklich weiter.

mshwery Avatar
mshwery:#7483

>>7482
Computerspiele

suribbles Avatar
suribbles:#7485

Eine Daumenregel für _praktische_ Anwendungen von Monaden, ist wenn die Berechnung in einem sequenziellen Kontext stattfindet, d.h. von den Berechnungen, die vorher stattfinden abhängig ist.

Bei IO ist es klar. Ein anderes einfaches Beispiel ist die monadische Verwendung von Maybe. Falls in einer Kette von Berechungen, die jeweils ein Ergebnis oder Nothing haben können, dieses Nothing irgendwo auftritt, dann ist das Gesamtergebnis auch Nothing, man muss nich extra Code schreiben um es an jeder Stelle zu prüfen, wie in anderen Sprachen beim null-pointer so ist. Klassisch bei Map lookups z.B.
Map.lookup :: k -> Map k v -> Maybe v

do
x <- Map.lookup key1 map1
y <- Map.lookup key2 map2
return (f x y)

Alles mögliche kann monadisches Verhalten aufweisen. Monadisches parsing z.B., wenn etwas vom vorher geparstem abhängt (siehe parsec). Sonst alles was irgendwo implizit einen Kontext oder state mitschleppt, von IRC bot bis Computerspiel.

Das konzeptionell schwierige bei Monaden ist wohl, dass es so ein abstraktes Objekt ist, dass fast alles irgendwie eine Monade ergibt.

arashmanteghi Avatar
arashmanteghi:#7487

>>7485
Wobei für dein Beispiel auch ein Applicative gereicht hätte ;)

dutchnadia Avatar
dutchnadia:#7488

>>7487
Ja, schon ^^

jacobbennett Avatar
jacobbennett:#7491

Ein interessantes Beispiel für praktische Nutzung von Monaden sind Parser (aus der Parsec- und Attoparsec-Bibliothek).

Für Beispiele siehe z. B. https://www.fpcomplete.com/school/starting-with-haskell/libraries-and-frameworks/text-manipulation/attoparsec

Ansonsten definieren Streaming-Bibliotheken (Conduit, Pipes, Machines) oder FRP-Bibliotheken (Reflex, FRPNow etc.) ihre eigenen Monaden, allerdings könnten die einen am Anfang auch ziemlich verwirren.

Shriiiiimp Avatar
Shriiiiimp:#7542

Was ist das eigentlich für ein Mem, dass Haskell gerne von Fallen verwendet wird?

albertaugustin Avatar
albertaugustin:#7550

>>7542
Haskell senkt Testosteron.

sementiy Avatar
sementiy:#7567

>>7550
Das ist gut.. oder?

alessandroribe Avatar
alessandroribe:#8128

>>7550
> Dieser Bernd lachte.

yigitpinarbasi Avatar
yigitpinarbasi:#8188

>>7482
gugle er 'Zygohistomorphic prepromorphism'

Neuste Fäden in diesem Brett: