你能“部分”派生一个类型类吗?

在下面的玩具示例中,我们创建了一个新类型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提供的默认实现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


以上是你能“部分”派生一个类型类吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>