Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell XTypeOperators扩展不';我不能像布拉格语那样工作_Haskell_Types - Fatal编程技术网

Haskell XTypeOperators扩展不';我不能像布拉格语那样工作

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) 它可以编译,但当我使用以下工具进行

我将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)
(当转换为type
True:::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提示下工作