在下面的玩具示例中,我们创建了一个新类型D
,我们希望为其实现类型类Show
。现在让我们假设,对于所有构造函数,派生的show
函数都可以,除了一个特殊情况A
,我们希望覆盖该默认值。
有可能做到这一点吗?或者你可以只派生出所有或没有?
data D = A | B | C
deriving (Show)
-- goal:
-- show A = "A is special"
-- show B = "B"
-- show C = "C"
main = print $ show A
在线试用!
这可以使用泛型来完成。generic-data
提供了showsPrec
、gshowsPrec
的默认实现,您可以使用模式匹配来处理之前的非默认情况:
{-# LANGUAGE DeriveGeneric #-}
import GHC.Generics
import Generic.Data (gshowsPrec)
data D = A | B | C
deriving (Generic)
instance Show D where
showsPrec _ A = ("A is special" ++)
showsPrec n x = gshowsPrec n x