使用“X”时没有(Show a)的实例

时间:2014-07-17 10:14:48

标签: haskell gadt

使用此代码

{-# LANGUAGE GADTs #-}
data X a where
     X :: (Show a, Num a) => a -> X a

instance Show (X a) where
         show (X x) = "X " ++ show x

instance Num (X a) where
         fromInteger x = X $ fromInteger x

我收到此错误:

No instance for (Show a) arising from a use of `X'
Possible fix:
  add (Show a) to the context of the instance declaration
In the expression: X
In the expression: X $ fromInteger x
In an equation for `fromInteger': fromInteger x = X $ fromInteger x

任何人都可以解释为什么我会收到此错误消息吗?

2 个答案:

答案 0 :(得分:2)

正确的解决方案是将约束添加到实例头,如下所示:

instance (Show a, Num a) => Num (X a) where
         fromInteger x = X $ fromInteger x

显然,您无法将X String视为Num

答案 1 :(得分:-1)

因为GHC停止将Show作为Num的超类。如果Show仍然是Num的超类(它在Haskell 2010报告中的方式),则使用fromInteger将允许编译器推导(显示)。

当然,Haskell 2010报告没有GADT。