在我熟悉的大多数 OO 语言中,toString
a 的方法String
实际上只是恒等函数。但是在 Haskell 中show
添加了双引号。
所以如果我写一个像这样的函数
f :: Show a => [a] -> String
f = concat . map show
它对数字按预期工作
f [0,1,2,3] -- "0123"
但是字符串以额外的引号结尾
f ["one", "two", "three"] -- "\"one\"\"two\"\"three\""
当我真的想要"onetwothree"
。
如果我想f
多态地编写,有没有办法只用一个Show
约束来完成它,而不用覆盖 String 的 Show 实例(如果这甚至可能的话)。
我能想到的最好的方法是创建自己的类型类:
class (Show a) => ToString a where
toString = show
并为所有内容添加一个实例?
instance ToString String where toString = id
instance ToString Char where toString = pure
instance ToString Int
instance ToString Maybe
...etc