【问题标题】:XTypeOperators extension doesn't work as pragmaXTypeOperators 扩展不能用作编译指示
【发布时间】:2011-12-26 18:07:00
【问题描述】:

我将 GHCi 7.0.3 与以下实现类型级列表的程序一起使用:

{-# LANGUAGE TypeOperators #-}

data True
data False

-- List
data Nil
data Cons x xs

-- Type-level infix operator must begin with ':'
data x ::: xs
infixr 5 ::: -- set precedence level to 5 (tight)

它可以编译,但是当我测试它时:

:t (undefined :: True:::Nil)

(当转换为 True:::Nil 类型时,undefined 的类型是什么?)我收到此错误:

Illegal operator `:::' in type `True ::: Nil'
  Use -XTypeOperators to allow operators in types

确实,当我使用标志启动 GHCi 时

-XTypeOperators

我得到了预期的结果:

(undefined :: True ::: Nil) :: True ::: Nil

我的问题是:为什么等效的 pragma 不起作用:

{-# LANGUAGE TypeOperators #-}

编辑:如果编译指示没有扩展到 GHCi 环境,那么我还有另一个难题。我试过这个程序:

class And b1 b2 b | b1 b2 -> b where
    andf :: b1 -> b2 -> b

-- truth table
instance And True True True where andf = undefined
instance And True False False where andf = undefined
instance And False True False where andf = undefined
instance And False False False where andf = undefined

它需要以下编译指示:

{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}

但是一旦编译,我可以在 GHCi 中使用它:

*Main> :t andf (undefined::True) (undefined::False)
          andf (undefined::True) (undefined::False) :: False

我猜在列表的情况下,解释器甚至无法使用类型级运算符::: 解析表达式,而在多参数类的情况下,命令行是可解析的。但是,想想看,GHCi 使用多参数类和函数依赖执行类型推断,不是吗?这种类型推断是在 GHCi 中完成的,而不是通过在编译代码中调用某些函数来完成的,对吧?

【问题讨论】:

    标签: haskell types


    【解决方案1】:

    关于在 GHCi 中启用扩展的其他答案是正确的,无论是从 GHCi 提示符还是作为启动 GHCi 时的标志。然而,还有第三种选择——您可以创建一个.ghci 文件,每次启动 GHCi 时都会加载并运行该文件,并使用它来自动启用扩展。特别是对于像TypeOperators 这样的东西,启用它几乎没有什么害处,非常方便。

    例如,这是我现在的样子:

    :set prompt "∀x. x ⊢ "
    :set -XTypeOperators
    import Control.Monad
    import Control.Applicative
    import Control.Arrow
    

    .ghci 文件位于您的系统用于此类文件的标准位置。


    回答您的扩展问题:有问题的代码大致在 GHCi 中工作,因为如果在另一个模块中使用它也可以工作,该模块使用 pragma 导入模块但本身没有启用它们。 GHC 不仅能够在每个模块的基础上启用扩展,即使导出的定义在没有扩展的情况下可能没有意义,或者具有需要它的推断类型。

    GHCi 中的区别有点模糊,因为它还将模块中未导出的定义置于范围内,但一般来说,如果从另一个模块中使用,任何可以工作的东西在 GHCi 提示符下也可以工作。

    【讨论】:

      【解决方案2】:

      您的编译指示是正确的;问题是您试图在 GHCi 中使用它,它不会继承加载模块的扩展,1确实 传递了它赋予的选项GHC 来编译您列出的文件(这就是它与 pragma 具有相同效果的原因)。

      您应该保留pragma,并且在启动GHCi时传递-XTypeOperators,或者在加载文件后启用它,如下所示:

      GHCi> :set -XTypeOperators
      

      1 这可能是非常不可取的,并且在许多情况下可能是不可能的,例如加载已编译的模块。

      【讨论】:

        【解决方案3】:

        LANGUAGE 杂注适用于源文件,它不会传播到 ghci-prompt。由于项目的多个源文件中可能存在冲突的编译指示,源编译指示默认情况下不能传播到ghci-prompt。有可能让*modules 的编译指示在提示符下生效,我不确定,但我认为它正在考虑实现,无论如何,到目前为止,它还没有实现,所以你需要设置扩展明确表示ghci

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-27
          • 1970-01-01
          • 2011-06-08
          • 1970-01-01
          相关资源
          最近更新 更多