Haskell类型类继承和参数化类型类

4

我想说,某个参数化的 monad st 可以使用常规内存,但是我的参数化 monad 的一个子类应该对内存类型施加额外的约束。 代码如下:

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)为真时,在(State st)的定义内部将Memory替换为RMemory;这将使State成为其存储器类型类参数化的东西。这个能做到吗?

1个回答

3
我怀疑你不能直接完成这个。但是,您可以通过添加一个间接层来很有效地作弊。请参阅John Hughes的“Haskell中的受限数据类型”以了解如何实现: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.39.2816
这是在syb-with-class中获得开放递归的相同技术。
我相当确定这会指引您朝着正确的方向前进。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接