这是我的数据类型:
data Foo a = Value Integer
|Boo a
我有一个将 Foo 数据类型转换为字符串的函数:
showFoo::Show a=> Foo a -> String
showFoo (Value n) = show n
showFoo (Boo a) = show a
例如:showFoo (Value 10) 变为:"10",但对于 showFoo(Boo "S"),它变为:"\"S\"" 但我只需要 "S"。
这是我的数据类型:
data Foo a = Value Integer
|Boo a
我有一个将 Foo 数据类型转换为字符串的函数:
showFoo::Show a=> Foo a -> String
showFoo (Value n) = show n
showFoo (Boo a) = show a
例如:showFoo (Value 10) 变为:"10",但对于 showFoo(Boo "S"),它变为:"\"S\"" 但我只需要 "S"。
这归结为show字符串的行为。
show旨在提供机器可读的输出,它不是一个漂亮的打印机,所以它在所有字符串周围放置逗号。这样,它就可以区分读取它们的时间10和时间。"10"
您的showFoo功能显然不是为show家庭设计的,因为它消除了ValueandBoo标签,所以 usingshow并不是您真正的意思。
可能的解决方案:
Show。a始终是字符串,请更改您的数据类型并且不要使用show.Showish类。使用-XFlexibleInstancesand-XOverlappingInstances覆盖 String 的实例,不要使用引号。init.tail.show $ a这只是您使用 GHCi 的结果,它显示了以前的结果。在已编译的程序中尝试此操作或尝试运行(在 GHCi 中)putStrLn (showFoo (Boo "S")),您将看到调用show字符串会产生一组引号。