你能“部分”派生一个类型类吗?
在下面的玩具示例中,我们创建了一个新类型D,我们要为其实现 typeclass 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