1

这是我的数据类型:

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"。

4

2 回答 2

4

这归结为show字符串的行为。 show旨在提供机器可读的输出,它不是一个漂亮的打印机,所以它在所有字符串周围放置逗号。这样,它就可以区分读取它们的时间10和时间。"10"

您的showFoo功能显然不是为show家庭设计的,因为它消除了ValueandBoo标签,所以 usingshow并不是您真正的意思。

可能的解决方案:

  1. 让步,全力以赴,推导出来Show
  2. 如果a始终是字符串,请更改您的数据类型并且不要使用show.
  3. 进一步了解类型类并定义您自己的Showish类。使用-XFlexibleInstancesand-XOverlappingInstances覆盖 String 的实例,不要使用引号。
  4. 通过使用破解它init.tail.show $ a
于 2012-10-22T00:39:26.497 回答
1

这只是您使用 GHCi 的结果,它显示了以前的结果。在已编译的程序中尝试此操作或尝试运行(在 GHCi 中)putStrLn (showFoo (Boo "S")),您将看到调用show字符串会产生一组引号。

于 2012-10-21T23:02:44.970 回答