使用此代码
{-# 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
任何人都可以解释为什么我会收到此错误消息吗?
答案 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。