如何编写Show for String的实例?

gap*_*ppy 5 haskell typeclass

我有一个关于定义类型类实例的基本问题.我使用Show类型类作为示例,我只考虑类中的函数show.像Bool这样的具体类型的Show实例很简单

instance Show Bool where
  show x = {function of x here}
Run Code Online (Sandbox Code Playgroud)

但对于String,它不是:

instance Show String where
  show x = {function of x here}
Run Code Online (Sandbox Code Playgroud)

产生可以理解的错误

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’
Run Code Online (Sandbox Code Playgroud)

当然不允许以下内容:

instance Show [Char] where
  show x = {function of x here}
Run Code Online (Sandbox Code Playgroud)

我可以定义一个新类型

newtype String2 = String2 String 
instance Formatter String2 where
  format (String2 x) = {function of x here}
Run Code Online (Sandbox Code Playgroud)

然而,我不能让我做"测试",因为我能够在Haskell做.

我错过了类型类的哪些基本特征?

bhe*_*ilr 11

Show类型类实际上有三个成员函数show,showsPrecshowList.在实例中Show Char,showList函数被重载以输出引号并将所有字母推送到一起而没有分隔符:

来自GHC.Show:

instance  Show Char  where
    showsPrec _ '\'' = showString "'\\''"
    showsPrec _ c    = showChar '\'' . showLitChar c . showChar '\''

    showList cs = showChar '"' . showLitString cs . showChar '"'
Run Code Online (Sandbox Code Playgroud)

在哪里showLitString定义为:

showLitString :: String -> ShowS
-- | Same as 'showLitChar', but for strings
-- It converts the string to a string using Haskell escape conventions
-- for non-printable characters. Does not add double-quotes around the
-- whole thing; the caller should do that.
-- The main difference from showLitChar (apart from the fact that the
-- argument is a string not a list) is that we must escape double-quotes
showLitString []         s = s
showLitString ('"' : cs) s = showString "\\\"" (showLitString cs s)
showLitString (c   : cs) s = showLitChar c (showLitString cs s)
Run Code Online (Sandbox Code Playgroud)

因此,有没有Show String实例,它仅仅是Show Char定义了如何调用show[Char]值特别.