假设您有一个数据结构(借自 question ):
data Greek = Alpha | Beta | Gamma | Delta | Eta | Number Int
现在可以使它成为
Show
的实例。通过附加 deriving 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
的方法覆盖。在面向对象编程中。
最佳答案
正如@phg 在评论中指出的那样,这也可以在 generic-deriving 的帮助下完成。 :
{-# LANGUAGE DeriveGeneric #-}
module Main where
import Generics.Deriving.Base (Generic)
import Generics.Deriving.Show (GShow, gshow)
data Greek = Alpha | Beta | Gamma | Delta | Eta | Number Int
deriving (Generic)
instance GShow Greek
instance Show Greek where
show (Number n) = "n:" ++ show n
show l = gshow l
main :: IO ()
main = do
print (Number 8)
print Alpha
关于haskell - 在 Haskell 中访问 "default show"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28665917/