2016-07-07 9 views
1

Ich versuche zu verstehen, was Monaden sind (nicht nur in Scala, sondern mit Beispiel Scala). Lassen Sie uns die meisten (meiner Meinung nach) einfaches Beispiel für eine Monade betrachten:Verständnis von Monaden in Scala

scala.Some 

Da einige Staats Artikel, sollte jede Monade in its classic sense für die flatMap und unit Funktionen, einige Regeln bewahren. Hier

ist die Definition von scala.Some

@inline final def flatMap[B](f: A => Option[B]): Option[B] 

So versteht es besser, wenn ich es from the category theory standpoint verstehen will. Also, wir überlegen uns eine Monade und es soll ein Funktor sein (aber zwischen was?).

Hier haben wir zur Kategorie Option[A] und Option[B] und die flatMap zusammen mit den f: A => Option[B] hinein geleitet wird, soll ein Functor zwischen ihnen definieren. Aber in der Definition der traditionellen Kategorie ist es ein Funktor von einer Kategorie zu sich selbst.

+2

Was genau ist Ihre Frage? Die Idee einer Monade und was 'flatMap' macht, ist einfach: Eine Monade ist eine Box, die einen Wert enthält, und Sie geben eine Funktion' f' an 'flatMap', die etwas mit dem Wert in der Box macht, und Sie erhalten zurück eine weitere Box, die das Ergebnis der Anwendung von "f" auf den Wert der Originalbox enthält. – Jesper

+1

Die Kategorie ist die Kategorie der Scala-Typen, also ist "Option" ein Endofunkt für diese Kategorie. – Lee

+0

@Lee Also bildet es jeden Typ 'T' auf' Option [T] '? – user3663882

Antwort

4

Die Kategorie ist die Kategorie der Scala-Typen, wobei die Objekte Typen sind und die Pfeile Funktionen zwischen den Werten dieser Typen sind. Option ist ein endofunctor in dieser Kategorie. Für jedes Objekt (d. H. Typ) in der Scala-Kategorie bildet der Typkonstruktor Option jeden Typ A in einen Typ Option[A] ab.

Zusätzlich wird jeder Pfeil f: A => B in einen Pfeil fo: Option[A] => Option[B] abgebildet, was Option.map tut.

Ein Monad ist ein Functor M zusammen mit zwei Operationen, unit: A => M[A] und join: M[M[A]] => M[A].

kann
def join[A](o: Option[Option[A]]): Option[A] = o match { 
    case None => None 
    case Some(i) => i 
} 

flatMap dann, flatMap(f, m) = join(map(f, m)) definiert werden: Für Option, unit(x: A) = Some(x) und join kann definiert werden. Alternativ kann die Monade unter Verwendung von unit und flatMap und join definiert als join(m) = flatMap(id, m) definiert werden.

+0

In Scala 'Join' ist' flatten' (soweit ich weiß). – user3663882

+0

Lassen Sie mich noch eine Frage stellen. Wie Sie gesagt haben, haben wir zwei Operationen "Join" und "Unit". In der [Kategorie-Monad-Definition] (https://en.wikipedia.org/wiki/Monad_ (category_theory) #Formal_definition) haben wir auch zwei natürliche Transformationen. Ist es das Gleiche oder können wir beweisen, dass unsere Monade gemäß der Kategoriedefinition eine "Monade" ist? Ich habe es nicht selbst gemacht und möchte nicht den tatsächlichen Beweis (wenn es wahr ist). Ich will nur wissen, ob es ist. – user3663882

+1

@ user3663882 Ja, 'join' und' unit' stimmen genau mit mu und eta überein. Darüber hinaus gelten die [Gesetze für sie] (http://eed3si9n.com/learning-scalaz/Monad+laws.html); Assoziativität entspricht dem Diagramm mit T^3, und die linke und rechte Identität sind, IIRC, äquivalent zu der anderen. – phg