如何使非谓语类型与类型 类 一起工作

How to make impredicative types work with type classes

我看到了我可以用 ImpredicativeTypes 做些什么,并且想看看我到底可以用它们做什么。当我 运行 当涉及到它们与 TypeClasses 的交互时,我觉得有些奇怪的行为。

:t mempty
mempty :: forall a. Monoid a => a

:t Right
Right :: forall a b. b -> Either a b

所以我想我可以将它们组合起来形成一个非谓语类型的表达式:

:t Right mempty
Right mempty :: forall a b. Monoid b => Either a b

看起来扩展并没有推断出非谓语类型,这似乎并不是那么不合理,因为我知道当您开始添加这样的功能时,在一般情况下类型推断并不总是可行的。

所以我决定只让我想要一个明确的指示类型这一事实:

:t Right mempty :: forall a. Either a (forall b. Monoid b => b)

这对我来说似乎非常合理,因为我实际上只是在 Right 类型签名中粘贴了 mempty 类型的 b,然后没有解除 forall.

但它给我以下错误:

No instance for (Monoid (forall b. Monoid b => b))

这似乎很荒谬。因为根据定义,每个 Monoid 都是 Monoid 的一个实例。

有人可以向我解释一下这里到底发生了什么吗?问题是在实际使用类型时实际决定一个实例是否太困难或不可能,因此 GHC 真的意味着 "No unambiguous / decidable instance for..." 而不是 "No instance..."?

作为旁注,当您从这种情况中取出类型类时,一切似乎都正常工作:

:t Right undefined :: forall a. Either a (forall b. b)

类型检查并返回我指定的指示类型。

所以这个问题没有被标记为未回答我想我只是重申评论中所说的内容。

基本上 ImpredicativeTypes 完全不受支持,甚至没有人真正知道它应该如何工作。因此,在当前状态下尝试对它做任何有意义的事情是一个坏主意。所以答案就是:"don't try to do that".