我看到了我可以用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类型。
答案 0 :(得分:0)
所以这个问题没有被标记为未答复我想我会重申评论中的内容。
基本上ImpredicativeTypes
完全不受支持,没有人真正知道它应该如何工作。因此,尝试在当前状态下对其进行任何有意义的操作都是一个坏主意。所以答案就是:“不要试图这样做。”