如何使impredicative类型使用类型类

时间:2016-07-21 19:56:10

标签: haskell typeclass impredicativetypes

我看到了我可以用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

看起来扩展名没有推断出不可预测的类型,这看起来并不合理,因为我知道当你开始添加这样的功能时,类型推断并不总是可行的。

所以我决定让我想要一个明确的impredicative类型:

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

对我而言似乎非常合理,因为我只是粘贴b类型签名中Right的{​​{1}}类型,然后不提升{{1} }}

但它给了我以下错误:

mempty

这似乎很荒谬。因为根据定义,每个forall都是No instance for (Monoid (forall b. Monoid b => b)) 的实例。

有人可以向我解释一下究竟发生了什么吗?问题是在实际使用该类型时实际决定一个实例是太难或不可能的,因此GHC实际上意味着"没有明确/可判定的实例..."而不是"没有实例..."?

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

Monoid

键入检查并返回我指定的impredicative类型。

1 个答案:

答案 0 :(得分:0)

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

基本上ImpredicativeTypes完全不受支持,没有人真正知道它应该如何工作。因此,尝试在当前状态下对其进行任何有意义的操作都是一个坏主意。所以答案就是:“不要试图这样做。”