所以說,我定義的數據類型單子記錄包含多態函數
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
進行量化。
我確定我只是在想這個錯誤。有人有主意嗎?
貝斯特,埃裏克