假设你有一个数据结构(来自于这个问题):
data Greek = Alpha | Beta | Gamma | Delta | Eta | Number Int
现在,我们可以通过在指令末尾添加“deriving Show
”将其实例化为Show
。
然而,如果我们希望将Number Int
显示为:
instance Show Greek where
show (Number x) = show x
-- ...
问题在于必须同时指定所有其他部分的希腊数据,例如:
Greek
。 show Alpha = "Alpha"
show Beta = "Beta"
对于这个小例子,当然可以实现。但是如果选项数很多,就需要大量的工作。
我想知道是否可以访问“默认显示”实现,并使用通配符调用它。例如:
instance Show Greek where
show (Number x) = show x
show x = defaultShow x
你因此“实现”了与默认方法不同的特定模式,其余模式由“回退机制”解决。
这有点类似于面向对象编程中使用
super.method
引用进行方法覆盖。
.. deriving Show
,然后编写一个漂亮打印的类(或者只是一个函数),以便按照您喜欢的格式显示数据。此外,在Haskell中不存在方法覆盖或super.method
,因为Haskell中没有子类型化。 - user2407038show
函数应该生成一个字符串,其中包含一个 Haskell 表达式,一旦执行该表达式即可还原出原始值。如果需要其他功能,应声明一个不同的函数(可能在自己的类中)。 - chiread(show[[1..],[2]])
不能得到原始列表。话虽如此,应用程序代码通常会违反合同,所以你想做什么并不罕见。有时候只需重写show
来使其更易读,忘记Haskell语法也是很方便的。 - chishow
不产生有效的Haskell语法,它仍然被普遍认为是面向程序员的。它的含义是“显示数据的文本表示,以便我可以知道它是什么”,而不是“将此值作为文本显示给最终用户”。用Python术语来说,它是repr
,而不是str
。因此,以一种与整数无法区分的方式显示一些希腊值是有点代码异味的。 - Ben