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

是否有可能在Haskell中否定类型参数约束?,haskell,types,polymorphism,Haskell,Types,Polymorphism,在Haskell中,可以向类型参数添加约束 例如: foo :: Functor f => f a 问题:是否可以否定约束 我想说的是,例如,f可以是除函子之外的任何东西 UPD: 所以它来自于如何映射底部嵌套函子的思想。 假设我有函子a,其中a可以是函子b,也可以不是b,同样的规则适用于b,这是不可能的原因:(基本上都是相同的原因,只是它的不同方面) 关于类型类有一个开放的假设。不可能证明类型不是类的实例,因为即使在编译模块的过程中,实例不在那里,这并不意味着有人没有在“以后”的模块

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

例如:

foo :: Functor f => f a
问题:是否可以否定约束

我想说的是,例如,
f
可以是除
函子之外的任何东西

UPD:

所以它来自于如何映射底部嵌套函子的思想。
假设我有
函子a
,其中
a
可以是
函子b
,也可以不是
b
,同样的规则适用于
b
,这是不可能的原因:(基本上都是相同的原因,只是它的不同方面)

  • 关于类型类有一个开放的假设。不可能证明类型不是类的实例,因为即使在编译模块的过程中,实例不在那里,这并不意味着有人没有在“以后”的模块中定义它。原则上,这可能在一个单独的包中,因此编译器不可能知道实例是否存在。
    (这类孤立实例通常是不受欢迎的,但它们有一些用例,语言并不试图阻止这种情况发生。)
  • 类中的成员身份是一个实例,这意味着您不应该将其视为一个经典的布尔值“实例或非实例”,而是,如果您可以证明某个类型是一个实例,那么这将为您提供该类型的某些特性(由类方法指定)。如果你不能证明这个类型是一个实例,那么这并不意味着没有实例,也许只是因为你不够聪明,无法证明它。(阅读“也许没有人足够聪明”。
    这又回到了第一点:编译器还没有实例可用是“不够聪明”的一种情况
  • 类不应该用于对类型是否在其中进行分派,而是用于启用某些多态函数,即使它们需要对类型设置特殊条件。这就是类方法所做的,它们可以来自类实例,但它们怎么可能来自“非类内实例”


现在,所有这些都说了,有一种方法你可以假装这样:用一个。别这么做,这是个坏主意,但是。。。这是你能得到的最接近的结果。

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

  • 关于类型类有一个开放的假设。不可能证明类型不是类的实例,因为即使在编译模块的过程中,实例不在那里,这并不意味着有人没有在“以后”的模块中定义它。原则上,这可能在一个单独的包中,因此编译器不可能知道实例是否存在。
    (这类孤立实例通常是不受欢迎的,但它们有一些用例,语言并不试图阻止这种情况发生。)
  • 类中的成员身份是一个实例,这意味着您不应该将其视为一个经典的布尔值“实例或非实例”,而是,如果您可以证明某个类型是一个实例,那么这将为您提供该类型的某些特性(由类方法指定)。如果你不能证明这个类型是一个实例,那么这并不意味着没有实例,也许只是因为你不够聪明,无法证明它。(阅读“也许没有人足够聪明”。
    这又回到了第一点:编译器还没有实例可用是“不够聪明”的一种情况
  • 类不应该用于对类型是否在其中进行分派,而是用于启用某些多态函数,即使它们需要对类型设置特殊条件。这就是类方法所做的,它们可以来自类实例,但它们怎么可能来自“非类内实例”


现在,所有这些都说了,有一种方法你可以假装这样:用一个。别这么做,这是个坏主意,但是。。。这是你能得到的最接近的答案。

你是想解决某个特定的问题,还是出于好奇?对于“f没有函子保险”的信息,你能/会怎么做?它看起来像一个奇怪的签名。通常使用类型约束来使用相应类提供的函数。简短的回答是不,这是不可能的。我想合成所有的函子,得到a的函子,其中a不是函子。然后我知道我映射到了底部函子。你们是在试图解决一个特定的问题,还是出于好奇?对于“f没有函子保险”的信息,你能/会怎么做?它看起来像一个奇怪的签名。通常使用类型约束来使用相应类提供的函数。简短的回答是不,这是不可能的。我想合成所有的函子,得到a的函子,其中a不是函子。然后我知道我映射到底部函子上。