[Haskell] Monoid?

CPU

Lieutenant
Registriert
Jan. 2006
Beiträge
704
Hallo,

könnte mir jemand mal kurz "aus dem Bauch heraus" erklären was Monoids sind und was ich mit denen tolles anfangen kann? Definiert sind die ja in Data.Monoid wie folgt:
Code:
class Monoid a where
  mempty :: a
  mappend :: a -> a -> a
  mconcat :: [a] -> a

Gruß,
CPU
 
Schon mal das von Wiki durchgelesen? http://de.wikipedia.org/wiki/Monoid
Monoid haben wir in Mathe (Mathematik für Informatiker) unter algebraischen Strukturen gelernt... so wie es auf wiki halt steht. Interessanter Code, ist das C++?
 
misa555 schrieb:
Ich weiß, dass ich im Internet viele Erklärungen finden kann. Aber ich suche eine umgangssprachliche, die verständlicher ist ...

misa555 schrieb:
Monoid haben wir in Mathe (Mathematik für Informatiker) unter algebraischen Strukturen gelernt... so wie es auf wiki halt steht. Interessanter Code, ist das C++?
Nein, das ist Haskell (wie der Titel schon sagt).
 
Bei einem Monoid handelt es sich um eine algebraische Struktur. Was bedeutet das? Nun, in der Mathematik gibt es Mengen von Objekten (Zahlen sind zum beispiel Objekte). Auf diese Mengen lassen sich Operationen anwenden. Je nach dem, welche Eigenschaften diese Operation über dieser Menge hat, nennt man diese Struktur eine Algebra, eine Halbgruppe, Monoid oder Gruppe.

Beispiel, wir haben eine Menge S von irgendwelchen Objekten. Zusätzlich haben wir einen Operator "$":

1.) "$" ist abgeschlosen, das bedeutet, wenn du "$" auf beliebige Elemente von S anwendest, kommt wieder ein Element aus S als Ergebnis heraus: S $ S -> S

Wenn diese Eigenschaft gegeben ist, dann nennt man die Algebraische Struktur (S, $) eine "Algebra".

2.) Wenn zusätzlich zur Abgeschlossenheit der Operator "$" auch noch assoziativ ist, dann nennt man die Struktur (S, $) eine Halbgruppe

Assoziativ: (a $ b) $ c = a $ ( b $ c) für alle a,b,c € S

3.) Wenn zusätzlich zur Abgeschlossenheit und zur Assoziativität es noch ein "Einselement" gibt, dann nennt man diese Struktur einen Monoid

Einselement ist ein Element, welches in Verbindung mit dem Operator "$" neutral ist: a $ f = a wobei a, f € S sind und f halt das "Einselement" ist (mit "Eins" ist nicht die Zahl gemeint, besser ist die Bezeichnung "neutrales Element").

Ich habe mal das € als "Element von" verwendet. Hoffe das hat geholfen, falls nicht, einfach noch mal fragen.

Was das jetzt in Verbindung mit Haskell bedeutet kann ich nicht sagen, aber vielleicht ergibt sich ja für dich da ein Sinn.

VG
 
Zuletzt bearbeitet:
@kelox, ja so habe ich das auch gelernt vor 5 Jahren oder so ^^ @CPU wollte ja nur helfen... das Haskell eine Programmiersprache ist, wusste ich nicht, bisher hab ich immer nur in Java programmiert.
 
@kelox: das ist eine super Erklärung - DANKE! -, die ich gut verstehen kann. Da ich Gruppen ansatzweise kenne, macht das für mich Sinn was Du geschrieben hast.

Es wäre jetzt nur noch für mich die Frage, wie ich das eben mit Monoid in Haskell verstehen soll: "mempty" könnte das neutrale Element sein etc. Aber wozu bildet man das in Haskell ab? Um welchen Anwendungsfall zu erfüllen?
 
Genau, 'mempty' ist das neutrale Element und 'mappend' ist die Verknüpfungsoperation. 'mconcat' ist redundant und nur aus Effizienzgründen vorhanden.
Der Grund für eine Monoid-Typeclass ist, dass du damit generischeren Code schreiben kannst. Möchtest du 2 Listen aneinander hängen, benutzt du normalerweise (++). Um 2 Sets(Mengen) zu vereinigen benutzt du 'Set.union'. Aber da beide Datentypen Monoid implementieren, kannst du in beiden Fällen auch einfach 'mappend' benutzen. Ebenso gilt das fürs neutrale Element: Anstatt 'Set.empty' oder [] sagst du einfach 'mempty'.
Wenn du dies machst, wird dein Code sowohl mit Listen, als auch mit Sets funktionieren. Da natürlich Listenverkettung und Set-Union nicht identisch sind, ist es von der Situation abhängig, ob das Ganze Sinn macht.

Wirklich notwendig ist die Verwendung der Monoid-Instanzen im Allgemeinen aber nicht. In den meisten Fällen sind die Funkionen, die hinter 'mappend' und 'mempty' stecken, auch nochmal separat vorhanden.
 
Zurück
Oben