假设有一个类型A
是 class 的实例C
。
如果我理解正确,要覆盖实例实现,通常的做法是引入一个 wrapper newtype A' = A' A
,然后将所有A
出现的A'
.
但是那么如何确保您不会不小心忘记包装一些A
s,并且所有A
s 都使用新的实现呢?
我们能做点什么吗?
假设有一个类型A
是 class 的实例C
。
如果我理解正确,要覆盖实例实现,通常的做法是引入一个 wrapper newtype A' = A' A
,然后将所有A
出现的A'
.
但是那么如何确保您不会不小心忘记包装一些A
s,并且所有A
s 都使用新的实现呢?
我们能做点什么吗?
您可以通过递归调用找出某些单态类型是否包含A
不在包装器内的. 这是这样一个混乱的例子:http: //lpaste.net/94105。如果出现以下情况,这将失败:A'
Language.Haskell.TH.reify
reify
不提供所需的信息。有时它不提供与给定名称对应的定义。包含 A 实例的类型,但不必提及如下HiddenA
类型
data HiddenA = forall a. C a => HiddenA a
instance C HiddenA where f (HiddenA x) = f x
不能保证您实际上将检查应用于您使用的功能
但至少这是一个编译时检查。
如果您的函数依赖于您自己C
提供的实现A'
,您可以在该函数的类型签名中表达它。所以而不是拥有
fGeneric :: C a => a -> b
你会用
fSpecific :: A' -> b
所以你知道你会得到哪种行为。