2013-06-20 11 views
10

Monad ist ein Monoid, aber es ist ein Monoid in einer anderen Weise als, sagen wir Integer. Ich frage mich, ob es eine Möglichkeit gibt, Monoid' und Monad' so zu schreiben, dass sowohl Integer als auch Monad' als Instanzen der gleichen Monoid' Typklasse ausgedrückt werden können? SoInstanz Monoid Monad

+6

Ich denke, dass Sie [diesen Blogbeitrag] (http://www.jonmsterling.com/posts/2012-01-12-unifying-monoids-and-monads-with-polymorphic-kinds.html) erklären möchten wie man guten Polymorphismus verwendet, um die beiden unter der gleichen Typklasse zu vereinheitlichen. –

+1

@GabrielGonzalez: Kannst du das zu einer Antwort machen? Es beantwortet tatsächlich die Frage, so wie ich sie verstehe, anders als die aktuelle Antwort. –

Antwort

4

Ich mache meinen Kommentar zu einer Antwort auf Tichons Bitte. This blog post zeigt, wie Monad und Monoid unter der gleichen Typklasse mit Hilfe von Art Polymorphismus zu vereinheitlichen. Dies unterscheidet sich ein wenig von der Antwort von Tel, da die Monade als Monoid in der Kategorie Endofunctors implementiert ist und nicht als Monoid in einer Kleisli-Kategorie.

+0

Und so machst du * das * Monoid! Ich wollte letzte Nacht keine Art von Kalkül durcharbeiten. –

+0

Die Verbindung ist tot. – user2023370

7

, lassen Sie uns eine bestimmte Art und Weise holen Integer hat eine Monoid

instance Monoid Int where 
    zero = 0 
    plus = (+) 

und jetzt ist hier ein MonadMonoid

{-# LANGUAGE FlexibleInstances #-} 
instance Monad m => Monoid (Kleisli m a a) where 
    zero = id 
    plus = (.) 

und hier ist eine andere

instance MonadPlus m => Monoid (m a) where 
    zero = mzero 
    plus = mplus 

Ich bin nicht sicher wie man die "Monade ist ein Monoid in der c Englisch: bio-pro.de/en/region/stern/magazin/...1/index.html Die Formulierung von Endofaktoren ist jedoch in Haskell nicht enthalten.