【发布时间】:2018-07-08 14:53:06
【问题描述】:
我正在研究一种容器类型,它基本上可以包含任何东西。像这样的:
data Foo a = Foo [a]
我正在为这种类型开发一个 Show 实例。
instance (Show a) => Show (Foo a) where
show (Foo x) = concat $ map show x
这很好用:
show (Foo [1,2,3]) -- creates the string "123"
show (Foo [True, False]) -- creates the string "TrueFalse"
但是,有时 foo 中包含的“a”已经是一个字符串,因此调用“map show x”是不必要的。在字符串上调用 show 的结果是在其周围放置“”。
show (Foot ["A", "B"]) -- creates the string ""A""B""
-- what I'd like is the string "AB"
有没有办法为 (Foo String) 定义一个单独的 Show 实例?
【问题讨论】:
-
这整个行业闻起来很腥。
Show的目的是作为Read的补充,因此读取您显示的内容应该是一个身份功能。在显示包含字符串的数据时打印原始字符串无论如何都是错误的。字符串可能包含各种不适合人类消费的杂物,并且会严重弄乱您的终端。show不仅添加了引号,而且避免了繁琐。 -
我质疑你的说法,“调用'map show x'是不必要的”。您建议的替代输出
"AB"会产生歧义:除了您的示例输入之外,Foo ["AB"]和Foo ["","A","","","B"]都会产生相同的输出。