我最近将类型类从约束MonadError GenError m
推广到MonadError e m, CanContainGenError e
更灵活的约束。这对于使用已具有ErrorT SomeError m
的堆栈的相关monad转换器非常有用 - 我可以在GenError
数据类型中添加SomeError
作为新构造函数的元素。
我发现自己很惊讶将自定义CanContainGenError
类编写为GenError
的硬编码。是不是有一个共同的ContainedType
类或某些类? (我几乎称它为“亚型”,嘿)
我刚刚编写的下面的CanContainType
或ContainsType
类是什么?
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。不过,我对任何想法都感兴趣。
答案 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
...
显然没有什么标准。