Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 安全实例覆盖_Haskell_Overriding_Newtype - Fatal编程技术网

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会有这样的事情。但正如你所说的,现在你应该记住使用支票。谢谢。是的,这是我的实现,但是它被库函数消耗了,我不能更改。