2013-06-20 63 views
10

Monad是一個幺半羣,但它是一個幺半羣,與Integer不同。我想知道是否有辦法編寫Monoid'Monad',這樣IntegerMonad'都可以表示爲類型相同的Monoid'的實例?instance Monoid Monad

+6

我想你想閱讀[此博客文章](http://www.jonmsterling.com/posts/2012-01-12-unifying-monoids-and-monads-with-polymorphic-kinds.html)解釋如何使用類型多態來統一兩個相同類型的類。 –

+1

@GabrielGonzalez:你可以把它變成答案嗎?根據我的理解,它實際上回答了問題,與當前的答案不同。 –

回答

4

我在Tikhon的要求下將我的評論變成了答案。 This blog post顯示如何使用類型多態性在相同類型類下統一MonadMonoid。這與Tel的回答略有不同,因爲monad是作爲endofunctors類別中的monoid實現的,而不是Kleisli類別中的monoid。

+0

這就是你如何做*那* Monoid!我昨天晚上不想通過類比微積分工作。 –

+0

鏈接已死亡。 – user2023370

7

所以,讓我們選擇一個特定的方式IntegerMonoid

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

,現在這裏是一個MonadMonoid

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

和這裏的另一個

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

我不知道如何表達「Monad是c中的幺半羣然而,在Haskell中,內部管理員的構想是不可能的。