2010-07-13 114 views
4

我想說的是,某些參數化monad st可以使用正則內存,但是我的參數化monad的子類應該對內存類型施加額外的約束。在代碼:Haskell類型繼承和參數類型類型

class Memory m where 
    ... 

class State st where 
    unit :: Memory m => a -> st m m a 
    bind :: (Memory m1, Memory m2, Memory m3) => st m1 m2 a -> (a -> st m2 m3 b) -> st m1 m3 b 

class RMemory m where 
    ... 

class State st => RState st where 
    -- no operators 

我現在的問題是,我想強加每當(RState ST)爲真,則(狀態STA)內存替換RMemory的定義中;這會使狀態變成在其記憶的類型類中參數化的東西。這可以做到嗎?

回答

3

我懷疑你不能直接這樣做。但是,您可以通過添加一個間接級別來非常有效地作弊。請參閱Haskell中John Hughes的受限數據類型以瞭解如何執行此操作:http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.39.2816

這與用於獲取syb-with-class中的開放式遞歸的技術相同。

我相當確定這應該指向正確的方向。