繁体   English   中英

如何编写Show for String的实例?

How is the instance of Show for String written?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有一个关于定义类型类实例的基本问题。 我使用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类型类实际上有三个成员函数, 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

2 如何编写“派生实例”声明?

我正在尝试将加密哈希存储为记录类型中的字段,但编译器抱怨: 这是代码: 如果我写一个独立的“派生实例”子句如下... ......那么错误就变成了 任何人都可以帮助我理解这个错误以及如何解决它? ...

4 如何编写状态 Monad 的实例

我对 Haskell 中的 monads 非常陌生,我正在尝试使用 monads ny 创建一些实例来发展我的知识,但我真的很困惑这个我遇到了一些错误并且已经使用了一段时间,因为我仍然不确定感谢任何帮助和解释,这是我迄今为止所拥有的,我有什么想法哪里出错了? ...

6 编写自己的类实例的程序的概念

这可能是一个简单的答案的基本问题,但我似乎无法将其背后的逻辑包裹住。 我将以一个著名的Java游戏Minecraft的简单示例开始。 玩家被置于一个世界中,并被允许与不同的对象进行交互。 假设玩家想要木头。 他看到一棵树,走过去,砍下它。 他看到另一棵树,走过去,然后照做。 他可 ...

7 为大和类型编写Hashable实例

我有一大笔钱 我需要此数据类型的Hashable实例。 我当然可以手动输入实例,但是幸运的是,基于泛型的hashWithSalt有一个默认实现。 不幸的是-就我所知-这要求可以在Value类型内“打包”的任何类型都具有Hashable实例。 好吧,UTCTime没有。 这 ...

8 在为Reader r编写Applicative实例时如何编写<*>

我坚持在Haskell Book中练习,“第22章读者”。 练习说“实施阅读器的应用”,它给出了以下内容: 我也写了一个Functor实例后编写了pure (我编写了Functor实例,因为否则GHC抱怨“没有实例(Functor (Reader r)) …来自实例声明的超类在实例声明 ...

9 为自定义镜头编写类别实例

我一直在阅读这篇文章,以了解镜片。 我知道这与Edward Knett的镜头包不同,但它对基础知识很有用。 所以,A Lens定义如下: 已经提到Lenses形成一个类别,我一直在尝试为Category类型类创建一个实例。 首先,我为函数编写了类型定义: 在此之后,我只 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM