2

假设有一个类型A是 class 的实例C

如果我理解正确,要覆盖实例实现,通常的做法是引入一个 wrapper newtype A' = A' A,然后将所有A出现的A'.

但是那么如何确保您不会不小心忘记包装一些As,并且所有As 都使用新的实现呢?

我们能做点什么吗?

4

2 回答 2

1

您可以通过递归调用找出某些单态类型是否包含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
    
  • 不能保证您实际上将检查应用于您使用的功能

但至少这是一个编译时检查。

于 2013-10-10T02:44:41.067 回答
1

如果您的函数依赖于您自己C提供的实现A',您可以在该函数的类型签名中表达它。所以而不是拥有

fGeneric :: C a => a -> b

你会用

fSpecific :: A' -> b

所以你知道你会得到哪种行为。

于 2013-10-09T17:36:39.223 回答