haskell - 是否可以在 Haskell 中否定类型参数约束?

标签 haskell types polymorphism

在 Haskell 中,可以为类型参数添加约束。

例如:

foo :: Functor f => f a

问题:是否可以否定约束?

我想说 f 可以是除了 Functor 之外的任何东西。

UPD:

所以它来自于如何映射底部嵌套的 Functor 的想法。 假设我有 Functor a 其中 a 可以是 Functor b 或不是,相同的规则适用于 b .

最佳答案

这不可能的原因:(基本上都是一样的原因,只是不同的方面)

  • 有一个关于类型类的开放世界假设。不可能证明一个类型不是一个类的实例,因为即使 在编译模块期间,实例不存在,这并不意味着有人没有定义它在一个“更进一步”的模块中。这原则上可以在一个单独的包中,这样编译器就不可能知道该实例是否存在。
    (这种孤儿实例通常是不受欢迎的,但它们有一些用例,并且语言不会试图阻止这种情况。)
  • 类(class)成员资格是 intuitionistic property ,这意味着您不应将其视为经典的 bool 值“实例或非实例”,而是,如果您可以证明类型是实例,那么这将为您提供该类型的某些特征(由类方法指定) .如果你不能证明该类型是一个实例,那么这并不意味着 没有 实例,而可能只是你不够聪明来证明它。 (阅读,“也许 没有人 足够聪明”。)
    这与第一点有关:编译器还没有可用的实例是“不够聪明”的一种情况.
  • 一个类不应该被用来调度一个类型是否在它里面,而是用于启用某些多态函数,即使它们需要类型上的特殊条件。这就是类方法的作用,它们可以来自类实例,但它们怎么可能来自“非类实例”?

现在,说了这么多,一种方法可以让你伪造这个:使用 overlapping instance .不要这样做,这是个坏主意,但是......这是你能得到的最接近的。

关于haskell - 是否可以在 Haskell 中否定类型参数约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58016489/

相关文章:

java - 从两个截然不同的类别中获取值进行比较

c++ - 智能指针与哑指针 : polymorphism behavior oddity

java - 为什么我们将对象存储在接口(interface)引用中?

haskell - "One or Both"是否有规范的 haskell 类型?

oop - 子类型优于类型类的优点

Haskell 字符串过滤函数

c - 为什么 C 没有无符号 float ?

haskell - Haskell 如何知道数据类型声明是变量还是命名类型?

haskell - 静态链接二进制文件中缺少调试符号

c - 关于无符号整数下溢的 C 行为问题