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變形金剛...... :)
更好的鏈接在這裏:http://blog.omega-prime.co.uk/?p=127 – gatoatigrado