2011-09-05 46 views
0

我想寫一個monad類類,它將指定DSL(域特定語言)monad的一些基本操作。幫助編寫monad類型類(關聯類型類?)

class Monad => MyDSLMonad where 
    type ExprTyp :: * -> * 
    var :: String -> ExprTyp α -> (ExprTyp α) 

其中ExprType指示表達式類型,var將引入一個新的變量聲明。

的想法是,我將有一個基地單子Base實施MyDSLMonad,這可能只是工作的事情就像Int的和Bool的,然後更高層次的抽象將單子變壓器,它可以工作在更高級別類型。

然而,Base實施的var功能可能依賴於一個事實,即它僅適用於Int的和Bool的,並且需要某種對var功能類型類的約束。所以,我想是這樣

class Monad => MyDSLMonad where 
    type ExprTyp :: * -> * 
    class ValidTypes 
    var :: ValidTypes α => String -> ExprTyp α -> (ExprTyp α) 

instance MyDSLMonad Base where 
    class ValidTypes Base = MyClass 

我知道rmonads通過某種類型的caseing做到這一點,但有一個更好的辦法嗎?另外,我還挺喜歡在普通單體包裝中使用像StateT這樣的monad變形金剛...... :)

回答