Haskell 安全实例覆盖
假设有一个类型Haskell 安全实例覆盖,haskell,overriding,newtype,Haskell,Overriding,Newtype,假设有一个类型a,它是类C的实例 如果我理解正确,为了覆盖实例实现,通常会引入一个包装器newtype a'=a'a,然后将a中出现的所有a 但是,如何确保您不会意外地忘记包装一些As,并且所有As都使用新的实现呢 我们能做些什么吗?如果您的函数依赖于A'提供的C的您自己的实现,您可以在该函数的类型签名中表达它。因此,与其 fGeneric :: C a => a -> b 你只需要 fSpecific :: A' -> b 所以你知道你会得到什么行为。你可以通过递归调用L
a
,它是类C
的实例
如果我理解正确,为了覆盖实例实现,通常会引入一个包装器newtype a'=a'a
,然后将a
中出现的所有a
但是,如何确保您不会意外地忘记包装一些A
s,并且所有A
s都使用新的实现呢
我们能做些什么吗?如果您的函数依赖于
A'
提供的C
的您自己的实现,您可以在该函数的类型签名中表达它。因此,与其
fGeneric :: C a => a -> b
你只需要
fSpecific :: A' -> b
所以你知道你会得到什么行为。你可以通过递归调用
Language.Haskell.TH.reify
来找出某些单态类型是否包含不在包装器A'
中的A
。这里有一个这样混乱的例子:。如果:
未提供所需信息。有时它不提供与给定名称对应的定义reify
- 包含实例的类型,但不必提及下面的类型,如
HiddenA
data HiddenA = forall a. C a => HiddenA a instance C HiddenA where f (HiddenA x) = f x
- 无法保证您实际将检查应用于所使用的函数
但至少这是一个编译时检查 哇,我不知道haskell会有这样的事情。但正如你所说的,现在你应该记住使用支票。谢谢。是的,这是我的实现,但是它被库函数消耗了,我不能更改。