Monads Flashcards

1
Q

Was ist ein Monad?

A
  • Ein funktionales Design Pattern
  • Ein Container für eine algebraische Datenstruktur z.b. Monoid
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Was ist ein Monoid?

A

Algebraische Struktur mit einer assoziativen binären Operation und einem identifizierenden Element

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Welche Regeln gelten für Monoids?

A
  • Assoziativität: (a*b)*c=a*(b*c)
  • Identifizierendes Element: Es gibt ein Element e in S für das jedes Element a in S gilt: e * a = a * e = a
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Beispiele für Monoiden

A
  • String mit concat und leerem String
  • Integer mit add und 0
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Funktionsweise Monad und Monoid?

A
  1. Wir nehmen ein Monoid aus dem Container (Monad)
  2. Führen eine Operation auf dem Monoid aus
  3. Fügen das Monoid in einen neuen Container ein
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Sind Option und Try Monaden oder Monoiden?

A

Monaden

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Warum ist Option ein Monad?

A

Option kann Some() oder None enthalten (Container leer oder befüllt)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Warum ist Try ein Monad?

A

Try kann Success oder Failure enthalten (Flasche ganz, Flasche kaputt)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Welchem Pattern ähnelt ein Monad?

A

Dem State Pattern

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Unterschied Monad zu Monoid?

A

Monad: Unterscheidet guten und schlechten Fall

Monoid: Konvertiert von einem Set in das gleiche Set

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Beispiel für One Track Code

A
object BottleState extends Enumeration {
	type BottleState = Value
	val Empty, Labeled, Filled, Capsuled, Consumed = Value
}
import BottleState._

case class Bottle(state: BottleState = Empty) {
def label: Bottle = copy(state= Labeled)
def fill:Bottle = copy(state= Filled)
def capsule:Bottle = copy(state= Capsuled)
def consume:Bottle = {
println(“ consuming… “)
copy(Consumed)
}
}
~~~

new Bottle().label.fill.capsule

~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Beispiel für Two Track Code

A
case class MaybeBottle(bottle: Option[Bottle]) {
	def label : MaybeBottle = bottle match {
		case Some(bottle:Bottle) => copy( Some(bottle.label))
		case None => copy(None)
	}
	def fill: MaybeBottle = bottle match {
		case Some(bottle:Bottle) => copy( Some(bottle.fill))
		case None => copy(None)
	}
	def capsule: MaybeBottle = bottle match {
		case Some(bottle:Bottle) => copy( Some(bottle.capsule))
	case None => copy(None)
	}
}

MaybeBottle(Some(new Bottle)).label.fill.capsule
MaybeBottle(None).label.fill.capsule
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Wie entpackt man Monads?

A

Durch for-comprehensions: for (x <- e1) yield toValue(x)

Monad:

for (bottle <- pack.bottles) yield bottle match {
	case Some(b) => b.consume
	case None => println("Found None")
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly