Haskell XTypeOperators扩展不';我不能像布拉格语那样工作
我将GHCi 7.0.3与以下实现类型级别列表的程序一起使用:Haskell XTypeOperators扩展不';我不能像布拉格语那样工作,haskell,types,Haskell,Types,我将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) 它可以编译,但当我使用以下工具进行
{-# 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)
(当转换为typeTrue:::Nil
时,未定义的类型是什么?)我得到以下错误:
Illegal operator `:::' in type `True ::: Nil'
Use -XTypeOperators to allow operators in types
事实上,当我用旗子启动GHCi时
-XTypeOperators
我得到了预期的结果:
(undefined :: True ::: Nil) :: True ::: Nil
我的问题是:为什么等效的pragma不起作用:
{-# LANGUAGE TypeOperators #-}
编辑:如果pragmas没有扩展到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
它需要以下pragmas:
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
但一旦编译,我可以在GHCi中使用它:
*Main> :t andf (undefined::True) (undefined::False)
andf (undefined::True) (undefined::False) :: False
我猜在列表情况下,解释器甚至无法使用类型级运算符:
解析表达式,而在多参数类的情况下,命令行是可解析的。但是,仔细想想,GHCi使用多参数类和函数依赖关系执行类型推断,不是吗?这种类型推断是在GHCi中完成的,而不是通过调用编译代码中的某个函数,对吗?您的pragma是正确的;问题是您试图从GHCi中使用它,它不会继承加载模块的扩展名,1但会将提供给GHC的选项传递给GHC以编译您列出的文件(这就是为什么它具有与pragma相同的效果)
您应该保留pragma,并在启动GHCi时传递-XTypeOperators
,或在加载文件后按如下方式启用它:
GHCi> :set -XTypeOperators
1这可能是非常不希望的,在许多情况下可能是不可能的,例如加载已编译的模块。语言杂注适用于源文件,它不会传播到ghci
-提示符。由于一个项目的多个源文件中可能存在冲突的杂注,因此默认情况下,源杂注无法传播到ghci
-提示符。我不确定,*模块
中的pragmas是否可能在提示时生效,但我认为应该考虑实现它,无论如何,到目前为止,它还没有实现,因此您需要明确地设置ghci
的扩展。关于在ghci中启用扩展,其他答案是正确的,从GHCi提示符或启动GHCi时作为标志。但是,还有第三个选项--您可以创建一个.ghci
文件,该文件将在每次启动ghci时加载并运行,并使用该文件自动启用扩展。特别是对于像类型操作符
这样的东西,启用它几乎没有什么害处,它非常方便
例如,下面是我现在的样子:
:set prompt "∀x. x ⊢ "
:set -XTypeOperators
import Control.Monad
import Control.Applicative
import Control.Arrow
.ghci
文件位于系统中此类文件的标准位置
回答您的扩展问题:所讨论的代码在GHCi中工作大致上是因为如果在另一个模块中使用它也会工作,该模块使用pragmas导入了该模块,但本身没有启用它们。GHC完全能够在每个模块的基础上启用扩展,即使导出的定义如果没有扩展就不可能有意义,或者具有需要扩展的推断类型
GHCi中的区别有点模糊,因为它还将模块中未导出的定义放在范围内,但一般来说,如果从另一个模块中使用任何可以工作的定义,都将在GHCi提示下工作