Die Verwendung von bind mit return entspricht der Verwendung von fmap. Tatsächlich
fmap f m = m >>= return . f
Die Verwendung von binden, die nicht mit fmap reproduziert werden kann, sind genau diejenigen, die nicht über diese Verwendung Rückkehr beinhalten. Um nur ein (hoffentlich) interessantes Beispiel für Listen zu geben, lassen Sie uns über L-Systems sprechen.
L-Systeme von Aristid Linden 1968. Als Ersetzungssysteme erstellt wurden, beginnen sie mit einem einfachen Objekt und wiederholt ersetzen Teile davon einen Satz von Umschreibregeln oder Produktionen mit. Sie können verwendet werden, um Fraktale und andere selbstähnliche Bilder zu erzeugen. Ein kontextfreies, deterministisches L-System (oder D0L) wird durch das Dreifache eines Alphabets, eines Axioms und einer Sammlung von Produktionsregeln definiert.
Für unser Alphabet, werden wir eine Art definieren:
data AB = A | B deriving Show
für unser Axiom oder Zustand beginnen, werden wir das Wort [A, B]
verwenden.
Für unsere Regeln benötigen wir eine Karte von einem einzelnen Buchstaben zu einer Folge von Buchstaben. Dies ist eine Funktion des Typs AB -> [AB]
. Verwenden wir diese Regel:
myRule :: AB -> [AB]
myRule A = [A, B]
myRule B = [A]
Um die Regel anzuwenden, müssen wir jeden Buchstaben mit seiner Produktionsregel neu schreiben. Wir müssen dies für alle Buchstaben gleichzeitig tun. Günstig, das ist genau das, was >>=
tut für Listen:
apply rule axiom = axiom >>= rule
Jetzt wollen wir unsere Regel zu unserem Axiom gelten, den ersten Schritt in der L-Systems zu erzeugen:
> apply myRule myAxiom
> [A, B, A]
Dies ist Linden der original L-System, verwendet für die Modellierung von Algen. Wir können laufen, es zu sehen Fortschritte:
> mapM_ print . take 7 $ iterate (>>= myRule) myAxiom
[A,B]
[A,B,A]
[A,B,A,A,B]
[A,B,A,A,B,A,B,A]
[A,B,A,A,B,A,B,A,A,B,A,A,B]
[A,B,A,A,B,A,B,A,A,B,A,A,B,A,B,A,A,B,A,B,A]
[A,B,A,A,B,A,B,A,A,B,A,A,B,A,B,A,A,B,A,B,A,A,B,A,A,B,A,B,A,A,B,A,A,B]
Im Allgemeinen binden für Listen ist concatMap
, und verwenden Sie es genau, wenn Sie Zuordnung mit Verkettung kombinieren möchten.Eine andere Interpretation ist, dass Listen eine nicht-deterministische Wahl darstellen und Funktionen binden, indem sie jede Möglichkeit einmal aus der Liste auswählen. Zum Beispiel Würfel:
do
d1 <- [1..6]
d2 <- [1..6]
return (d1, d2)
Dies gibt alle möglichen Arten von 2W6 rollen.
'fmap' erfordert, dass das Ergebnis genau so viele Elemente enthält wie die ursprüngliche Liste. Mit der Monade können Sie die resultierende Liste entfernen (über "guard") oder hinzufügen (ich gehe davon aus, dass sie ausgeblendet wird). – chepner