2015-02-12 65 views
0

>>=類型簽名如下:也許單子和>> =

(>>=) :: Monad m => m a -> (a -> m b) -> m b 

及以下有意義的我(這也是單子法律之一):

(>>=) (Just 1) (id . return) == Just 1 

然而,前奏給出以下內容:

Prelude> :t (>>=) (Just 1) id 
(>>=) (Just 1) id :: Num (Maybe b) => Maybe b 

我會預料前奏曲返回一些錯誤爲typ身份證上的簽名是(a -> a)而不是Monad m => (a -> m b)

有理解這裏發生了什麼的好方法嗎? (>>=) (Just 1) id有沒有用?

+3

它可能有助於注意到'm >> = id'等同於'join m','join'具有簽名'Monad m => m(m a) - > m a'。 – 2015-02-12 07:43:50

+0

他們似乎略有不同,不是嗎? '''(>> =)只要1 $ id :: Num(也許(a - > a) - >(a - > a) - > b)=> b'''與'''join(只有1) :: Num(也許a)=>也許a''' – abhillman 2015-02-12 07:47:36

+1

你需要更多的括號:'(>> =)(只是1)$ id'應該是相同的。 – 2015-02-12 07:49:52

回答

3

類型的idc -> c(使用不同的字母,以便不與ab發生在的>>=類型衝突)。如果我們選擇c = a = Maybe b,我們可以統一c -> ca -> Maybe b

因此,這意味着>>=在你的例子是在類型中:

(>>=) :: Maybe (Maybe b) -> (Maybe b -> Maybe b) -> Maybe b 

現在你有

(>>=) (Just 1)   id 

對於Just 1Maybe (Maybe b)型,Maybe b必須在Num(因爲那時1可以解釋爲Maybe b)。

+0

謝謝@kosmikus。是否有一個閱讀統一類型的好地方?我不太瞭解這個概念。 – abhillman 2015-02-12 08:00:03

+0

另外,如果說'''1''被解釋爲monad,那麼是否正確? – abhillman 2015-02-12 08:01:25

+1

@abhillman取決於你想要得到的理論和徹底性。皮爾斯的「類型和編程語言」非常好,徹底。但是如果你正在尋找一個更隨意的介紹,你可能只想看看Haskell的書。 – kosmikus 2015-02-12 08:01:42

相關問題