如何声明newtype语句中的类型变量是属于某个类型类的类型?

时间:2014-03-06 00:20:01

标签: haskell typeclass newtype

假设我有这个新类型:

newtype SomeType a = SomeType { foo :: OtherType a }

我想确保a可展示(属于类型类Show x)。

我如何确保? (它甚至可能吗?)

奖励积分:我是否正确使用了术语?

2 个答案:

答案 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)

在所有这些签名中,可以省略约束而没有任何问题。