你能"partially"派生一个类型类吗?



在下面的玩具示例中,我们创建了一个新类型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提供了showsPrecgshowsPrec的默认实现,您可以使用模式匹配来处理之前的非默认情况:

{-# 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

最新更新