2013-03-19 119 views
0

所以說,我定義的數據類型單子記錄包含多態函數

data WAtom a = WAtom {innerVal :: a, temper :: WPart a -> WPart a } 

data WPart a where 
    WUnit :: WAtom a -> WPart a 
    WCompound :: WAtom a -> WAtom a -> WPart a 

atomize :: WPart a -> a 
atomize (WUnit a) = innerVal a 
{- Write one for compound too -} 

現在我要讓WPart單子的一個實例。目前爲止似乎都很好。 我希望bind通過調用monad的innerVal上的bound函數來產生一個新的monad。然後調用原始單子這個新單子的temper

instance Monad (WPart) where 
    return a = WUnit $ WAtom a 
    (WUnit c) >>= f = let new_part = f $ innerVal c in 
          (temper $ atomize new_part) (WUnit c) 

然而,這並不類型檢查。 monad的定義認爲,綁定中的f可以更改monad的內部類型。這對我有意義。然而,我似乎處在一個兩難境地的角落:1)如果我限制WAtom可以採用什麼類型,比如說定義數據類型爲WAtom Int,那麼我將在Monads * - > *上運行Kind限制。但如果我不知道,那麼我不知道綁定中的f將返回與傳入的原始monad相同類型的單子。此外,由於顯而易見的原因,我無法對temper進行量化。

我確定我只是在想這個錯誤。有人有主意嗎?

貝斯特,埃裏克

回答

1

假設WUnit c :: WPart a我們有f :: a -> WPart b所以new_part :: WPart batomize new_part :: b ...所以我們已經不能稱之爲temper :: forall a. WAtom a -> WPart a -> WPart a除非我們能爲一些e約束b ~ WPart (WAtom e)。更糟糕的是,即使temper $ atomize new_part :: WPart b -> WPart b我們仍然有WUnit c :: WPart a其中a ~ b沒有,一般來說,舉行。

所以,這絕對不是Monad的實施。

相關問題