这是我的数据类型:
data Foo a = Value Integer
|Boo a
我有一个将Foo数据类型转换为String的函数:
showFoo::Show a=> Foo a -> String
showFoo (Value n) = show n
showFoo (Boo a) = show a
例如:showFoo(值10)变为:“10”,但对于showFoo(Boo“S”),它变为:“\”S \“”但我只需要“S”。
答案 0 :(得分:4)
这归结为show
带字符串的行为。
show
旨在提供机器可读的输出,它不是一台漂亮的打印机,
所以它在所有字符串中放置了引号。这样它可以告诉
10
和"10"
之间的区别,当它正在读回来时。
您的showFoo
功能显然不属于show
系列,
因为它删除了Value
和Boo
标记,所以使用show
并不是真的
你的意思是。
可能的解决方案:
Show
。a
始终是字符串,请更改您的数据类型,不要使用show
。Showish
类。
使用-XFlexibleInstances
和-XOverlappingInstances
覆盖
String的实例,不要使用引号。init.tail.show $ a
答案 1 :(得分:1)
这只是你使用GHCi的结果,它显示了之前的结果。在已编译的程序中尝试此操作或尝试运行(在GHCi中)putStrLn (showFoo (Boo "S"))
,您将看到在字符串上调用show
会产生一组引号。