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

mkU*_*tra 1 polymorphism haskell types

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

例如:

foo :: Functor f => f a
Run Code Online (Sandbox Code Playgroud)

问题:可以否定约束吗?

我想说的f可以是任何东西Functor,例如。

UPD:

因此,它来自于如何映射底部嵌套的Functor的想法。假设我有一个可以存在或不存在的Functor a地方,并且相同的规则适用于。aFunctor bb

lef*_*out 6

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

  • 对于类型类有一个开放的假设。不可能证明类型不是类的实例,因为即使在模块的编译过程中,该实例不存在,也不意味着有人没有在模块中进一步定义它。马路”。原则上,这可以放在单独的程序包中,这样编译器就不可能知道实例是否存在。
    (这种孤儿实例通常不被接受,但是有一些用例,并且该语言不会尝试阻止这种情况。)
  • 类中的成员资格是一种直觉的属性,这意味着您不应将其视为经典的布尔值“实例或非实例”,而是,如果您可以证明类型是实例,那么这为您提供了某些功能类型(由类方法指定)。如果您不能证明类型是一个实例,那么这并不意味着就没有实例,而仅仅是证明您不够聪明而无法证明它。(请阅读“也许没有人足够聪明”。)
    这可以回溯到第一点:尚未使实例可用的编译器就是“不够聪明”的一种情况。
  • 类不应该用于对类型是否在其中进行调度,而是用于启用某些多态函数,即使它们在类型上需要特殊条件也是如此。那就是类方法的作用,它们可以来自类实例,但是它们又怎么可能来自“非类实例”呢?

现在,所有的说,有一种方法可以种假冒这样的:有重叠的情况。不要这样做,这是一个坏主意,但是...那是您可以获得的最接近的东西。