是否有“ContainsType”类?

时间:2011-04-12 23:36:33

标签: haskell types

我最近将类型类从约束MonadError GenError m推广到MonadError e m, CanContainGenError e更灵活的约束。这对于使用已具有ErrorT SomeError m的堆栈的相关monad转换器非常有用 - 我可以在GenError数据类型中添加SomeError作为新构造函数的元素。

我发现自己很惊讶将自定义CanContainGenError类编写为GenError的硬编码。是不是有一个共同的ContainedType类或某些类? (我几乎称它为“亚型”,嘿)

我刚刚编写的下面的CanContainTypeContainsType类是什么?

class CanContainType cont orig where
    toCont   :: orig -> cont
    fromCont :: cont -> Maybe orig

class ContainsType orig sub where
    toContainer :: orig -> cont
    fromContainer :: cont -> orig

示例实例化的地方是:

-- edit fixed example instance to reflect what I want, sorry for the misleading code
data IntOrFloatOrDouble= I Int | F Float | D Double
instance CanContainType IntOrFloatOrDouble Int where
    toCont   = I
    fromCont (I a) = Just a
    fromCont _ = Nothing

现在我输入了这个,我意识到可能没有一个已建立的,因为我的要求强制要求MPTC。不过,我对任何想法都感兴趣。

1 个答案:

答案 0 :(得分:1)

有时这样的事情出现在EDSL构造中,用于将实例从Haskell提升到EDSL。参见例如http://www.galois.com/~dons/tmp/Type.hs

data IntegralType a where
  TypeInt     :: IntegralDict Int     -> IntegralType Int
  TypeInt8    :: IntegralDict Int8    -> IntegralType Int8
  TypeInt16   :: IntegralDict Int16   -> IntegralType Int16
  TypeInt32   :: IntegralDict Int32   -> IntegralType Int32
  TypeInt64   :: IntegralDict Int64   -> IntegralType Int64
  ...

显然没有什么标准。