假设我有这个新类型:
newtype SomeType a = SomeType { foo :: OtherType a }
我想确保a
可展示(属于类型类Show x
)。
我如何确保? (它甚至可能吗?)
奖励积分:我是否正确使用了术语?
答案 0 :(得分:4)
可以使用DatatypeContexts
扩展程序,但强烈建议不要这样做:
newtype Show a => SomeType a = SomeType { foo :: Maybe a }
建议将约束放在使用SomeType
或使用GADT的函数上。有关详细信息,请参阅这些问题的答案。
Alternative for deprecated -XDatatypeContext?
DatatypeContexts Deprecated in Latest GHC: Why?
基本上,它没有添加任何有用的东西,它使你必须把限制放在他们不需要的地方。
答案 1 :(得分:3)
为了在一个小例子中演示@ David的答案,想象一下你正在实现平衡二叉树的另一个化身。当然键必须是Ord
,因此您需要在类型声明中添加约束:
data Ord k => Tree k v = Tip | Bin k v (Tree k v) (Tree k v)
现在,这个约束会感染您正在使用此类型的所有其他签名 ,即使您实际上并不需要订购密钥。它可能不是一件坏事(毕竟,你需要至少在某个地方订购它们 - 否则,你并没有真正使用它Tree
)并且它肯定不会破坏代码,但是仍然会降低其可读性,增加噪音并分散注意力。
empty :: Ord k => Tree k v
singleton :: Ord k => k -> v -> Tree k v
find :: Ord k => (v -> Bool) -> Tree k v -> Maybe v
instance Ord k => Functor (Tree k)
在所有这些签名中,可以省略约束而没有任何问题。