繁体   English   中英

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

[英]Is it possibile to negate type parameter constraint in Haskell?

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

例如:

foo :: Functor f => f a

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

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

升级版:

所以它来自如何将 map 底部嵌套的 Functor 的想法。 假设我有Functor a其中a可以是Functor b也可以不是,并且相同的规则适用于b

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM