Pet*_*all 8 string polymorphism haskell
在我熟悉的大多数OO语言中,a的toString方法String实际上只是身份函数.但在Haskell中show添加了双引号.
所以如果我写一个像这样的函数
f :: Show a => [a] -> String
f = concat . map show
Run Code Online (Sandbox Code Playgroud)
它按预期的数字工作
f [0,1,2,3] -- "0123"
Run Code Online (Sandbox Code Playgroud)
但字符串最终会有额外的引号
f ["one", "two", "three"] -- "\"one\"\"two\"\"three\""
Run Code Online (Sandbox Code Playgroud)
当我真的想要的时候"onetwothree".
如果我想以f多态方式编写,是否有办法只使用Show约束,而不覆盖Show的String实例(如果可能的话).
我能想到的最好的方法是创建自己的类型类:
class (Show a) => ToString a where
toString = show
Run Code Online (Sandbox Code Playgroud)
并为一切添加实例?
instance ToString String where toString = id
instance ToString Char where toString = pure
instance ToString Int
instance ToString Maybe
...etc
Run Code Online (Sandbox Code Playgroud)
我认为问题的根本原因show并非如此renderToText.它应该生成可以粘贴到Haskell代码中的文本以获得相同的值,或者使用转换回相同的值read.
为此目的,show "foo" = "foo"是行不通的,因为show "1" = "1"和show 1 = "1",这会丢失信息.
您希望能够应用于"foo"获取"foo"和1获取的"1"操作不是show.show只是不是一个Java风格toString.
当我以前需要这个时,我确实创建了自己的新类型,并制作了一堆实例,然后使用它而不是Show.大多数实例都是使用show,但String不是我想要自定义的唯一实例,因此单独的类型类没有被完全浪费.在实践中,我发现实际上只需要少量几种类型的实例,并且在编译错误时添加它们非常简单.
| 归档时间: |
|
| 查看次数: |
699 次 |
| 最近记录: |