我有一个关于定义类型类实例的基本问题 . 我使用Show类型类作为示例,我只考虑类中的函数show . 像Bool这样的具体类型的Show实例很简单
instance Show Bool where
show x = {function of x here}
但对于String,它不是:
instance Show String where
show x = {function of x here}
产生可以理解的错误
Illegal instance declaration for ‘Formatter String’
(All instance types must be of the form (T t1 ... tn)
where T is not a synonym.
Use TypeSynonymInstances if you want to disable this.)
In the instance declaration for ‘Formatter String’
当然不允许以下内容:
instance Show [Char] where
show x = {function of x here}
我可以定义一个新类型
newtype String2 = String2 String
instance Formatter String2 where
format (String2 x) = {function of x here}
然而,我不能让我做“测试”,因为我能够在Haskell做 .
我错过了类型类的哪些基本特征?
1 回答
Show
类型类实际上有三个成员函数,show
,showsPrec
和showList
. 在Show Char
的实例中,showList
函数被重载以输出引号并将所有字母推送到一起而没有分隔符:从GHC.Show:
其中showLitString定义为:
所以没有
Show String
实例,只是Show Char
定义了如何在[Char]
值上专门调用show
.