【问题标题】:Existentially quantified types example fails in ghc 7.2.2存在量化类型示例在 ghc 7.2.2 中失败
【发布时间】:2012-01-16 06:56:41
【问题描述】:

根据维基百科,以下代码应该可以编译,

{-# LANGUAGE RankNTypes #-}
data T = MkT (exists a. Show a => a)

但是,我没有运气。 ghci 7.2.2 抱怨,

test.hs:2:23:
    Illegal symbol '.' in type
    Perhaps you intended -XRankNTypes or similar flag
    to enable explicit-forall syntax: forall <tvs>. <type>
Failed, modules loaded: none.

原文链接在这里:http://en.wikibooks.org/wiki/Haskell/Existentially_quantified_types

提前致谢!

【问题讨论】:

  • 您需要使用ExistentialQuantification 标志来执行此操作,而无需GADTs
  • @is7s,谢谢,“存在主义被 GADT 包含”这个答案对我特别有帮助,因为我在这种情况下熟悉它们。

标签: haskell ghc higher-rank-types


【解决方案1】:

您链接的页面提到 exists 作为关键字不存在,但您可以使用 forall 获得相同的行为。请注意,您的特定示例的标题为“(伪)haskell”。

他们说这相当于:

data T = forall a. MkT a

MkT :: forall a. a -> T

【讨论】:

  • 哦,呵呵,谢谢!在这种情况下,它就像拥有一个实际的exists 一样强大,对吧?我想写一些“f :: a -> exists t.t”,但我认为这是错误的,原因有很多……我可能不得不以某种方式使用泛型……
  • 我认为它同样强大,但我也是最近才开始学习存在类型:)
  • 如果你想包含Show a 上下文,它变成data T = forall a. (Show a) =&gt; MkT a。如果我没记错的话,UHC 实际上支持exists 关键字。
【解决方案2】:

在ghci模式下,应该是这样的。

ghci&gt; :set -XRankNTypes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多