2013-06-20 16 views
10

Monad jest monoidem, jednak jest monoidem w inny sposób niż, powiedzmy, Integer. Zastanawiam się, czy istnieje sposób na napisanie Monoid' i Monad' tak, że zarówno Integer, jak i Monad' mogą być wyrażone jako instancje tej samej czcionki typowej Monoid'?instancja Monofoniczna monada

+6

Myślę, że chcesz przeczytać [ten wpis na blogu] (http://www.jonmsterling.com/posts/2012-01-12-unifying-monoids-and-monads-with-polymorphic-kinds.html) wyjaśniając jak wykorzystać rodzaj polimorfizmu do zjednoczenia dwóch w ramach tej samej klasy. –

+1

@GabrielGonzalez: Czy możesz zmienić to w odpowiedź? Właściwie odpowiada na pytanie, tak jak ja to rozumiem, w przeciwieństwie do obecnej odpowiedzi. –

Odpowiedz

4

Zmieniam mój komentarz w odpowiedź na prośbę Tichona. This blog post pokazuje, jak ujednolicić Monad i Monoid w ramach tego samego typu klasy przy użyciu polimorfizmu rodzajowego. To trochę różni się od odpowiedzi Tela, że ​​monada jest implementowana jako monoid w kategorii endofunktorów, a nie monoidów w kategorii Kleisli.

+0

I tak właśnie robisz * to * Monoid! Nie chciałem wczoraj przejść przez rachunek rodzajowy. –

+0

Link nie działa. – user2023370

7

Tak, niech wybrać konkretny sposób Integer ma Monoid

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

i teraz oto MonadMonoid

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

i oto kolejny

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

nie jestem pewien jak wyrazić "Monada to monoid w c jednak "formułowanie" endofunktów w Haskell.