我不明白为什么我的Show
类型类抱怨使用自定义类型,因为我已经为其提供了一个实例:
自定义类型
data Numeric=I Int | D Double
instance Show Numeric where
show (I x)=show x
show (D y)=show y
instance Num Numeric where
(+) (I a) (I b) =I (a+b)
(+) (D a) (I b) =D (a+ fromIntegral b)
(+) (I a) (D b)=D (fromIntegral a+b)
(-) (D a) (I b)= D (a- fromIntegral b)
(-) (I a) (D b)=D(fromIntegral a -b)
抱怨的方法
arrayToString::Num a=>[a]->String
arrayToString arr =intercalate "," $ map show arr
因此,鉴于我的type
实现了Num
和Show
类型类,我不明白为什么我在喂arrayToString
和[Numeric]
时为什么会出现此错误。值
错误
* Could not deduce (Show a) arising from a use of `show'
from the context: Num a
bound by the type signature for:
arrayToString :: forall a. Num a => [a] -> String
at Types.hs:40:5-37
Possible fix:
add (Show a) to the context of
the type signature for:
arrayToString :: forall a. Num a => [a] -> Strin
答案 0 :(得分:7)
如果要显示某些内容,请使用Show
约束:
arrayToString :: (Show a) => [a] -> String
当我向arrayToString提供[Numeric]值时,我不明白为什么会出现此错误
请注意,函数arrayToString
没有特定于Num
或Numeric
的任何内容。它所做的就是为任何可显示的内容(通过show
)呈现一个字符串。
答案 1 :(得分:7)
问题是您不是使用自定义类型。
给定的类型签名为arrayToString :: forall a. Num a => [a] -> String
。您已经对a
类型类的所有可能类型Num
进行了量化。这包括您的类型,但也包括所有将要存在的其他数字类型。这句话太大胆了。
您可能要考虑直接使用您的类型将签名更改为arrayToList :: [Numeric] -> String
,而不是依赖于参数多态性。
此外,[]
是单链接列表(或约束列表),而不是数组。
编辑:要将这个问题转化为逻辑,您要做的就是说
Numeric
Numeric
的元素是类Num
和Show
的成员Num
类中的所有可能的类型,我可以将该类型的列表转换为字符串您已经大大增加了该语句的范围,以使其包含一堆我们一无所知的类型,并且没有证据证明它们可以转换为字符串。