首页 文章

如何编写Show for String的实例?

提问于
浏览
5

我有一个关于定义类型类实例的基本问题 . 我使用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 回答

  • 11

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

    GHC.Show

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

    其中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)
    

    所以没有 Show String 实例,只是 Show Char 定义了如何在 [Char] 值上专门调用 show .

相关问题