【问题标题】:Compilation error when trying to use existential types in Haskell尝试在 Haskell 中使用存在类型时出现编译错误
【发布时间】:2012-02-13 18:34:11
【问题描述】:

我收到如下错误消息:

Linear.hs:215:27:
    Couldn't match expected type `forall v1.
                                  Ident v1 =>
                                  SubstT v1 (GenericLL (a v1 c)) n x'
                with actual type `forall v1. Ident v1 => SubstT v1 a0 m0 b0'
    Expected type: (forall v1.
                    Ident v1 =>
                    SubstT v1 (GenericLL (a v1 c)) n x)
                   -> n x
      Actual type: (forall v1. Ident v1 => SubstT v1 a0 m0 b0) -> m0 b0
    In the first argument of `flattenImpl', namely `runSubstT'
    In the expression: flattenImpl runSubstT

实际类型似乎比预期类型更通用。那么这种错误消息的可能原因是什么?该消息是否具有误导性或我阅读不正确?

我要做的是传递一个存在量化的函数runSubstT,其类型是:

runSubstT :: (Monad m) => (forall v. (Ident v) => SubstT v a m b) -> m b

我还将对 GHC 编译器如何对存在量化类型执行类型匹配进行一些很好的描述。

【问题讨论】:

  • 您能否发布一个能够重现该问题的小型独立示例? (我不保证我能回答,我只是想自己更好地理解存在类型)。

标签: haskell compiler-errors ghc existential-type


【解决方案1】:

我有一个猜测,但在您发布足够的代码以重现错误之前,我无法确定。我的猜测,基于看这个:

runSubstT :: (Monad m) => (forall v. (Ident v) => SubstT v a m b) -> m b

是否使第二种类型“a”依赖于第一种存在类型“v”可能是一个问题。预期类型:

forall v1。 Ident v1 => SubstT v1 (GenericLL (a v1 c)) n x'

将第二种类型替换为 (GenericLL (a v1 c)),它依赖于第一个存在类型“v1”。这可能是冲突的根源,但没有代码我无法跟踪类型检查器的登录。

【讨论】:

  • 是的,我认为这确实是问题所在。我花了很长时间才意识到 - 我对存在类型还是很陌生。
猜你喜欢
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 2015-07-11
  • 2018-04-03
  • 2013-03-04
相关资源
最近更新 更多