繁体   English   中英

使用Haskell2010构建Cabal文件时解析错误(可能是缩进不正确……)

[英]parse error (possibly incorrect indentation …) when building a cabal file with Haskell2010

我在Haskell项目中遇到以下错误。 我为Haskell项目制作了一个阴谋文件,以正确安装它。 当我用ghc --make二进制文件时,该项目编译良好,但是当我使用cabal build cabal文件时,出现以下错误:

src/Text/MarkIt/Verif.hs:12:3: error:
    parse error (possibly incorrect indentation or mismatched brackets)

我文件的开头是:

module Text.MarkIt.Verif where
import qualified Control.Monad.Trans.State.Strict as Tr
import Text.MarkIt.Types
import Data.List

class Verif a where
  summary :: a -> Tr.State StatDoc ()

instance Verif MarkIt where
  summary (MarkIt meta blocks) = do
  summary meta
  mapM_ summary blocks  -- This is the boring line

instance Verif Meta where
  summary meta = mapM_ summary (mAuthors meta)

我试图用ghc重建可执行文件,并且编译良好。 我检查了他们是否没有隐藏的字符,列表,错误的行尾……什么都没有! 我终于从cabal文件中删除了以下行:

default-language:    Haskell2010

然后,我的阴谋文件被构建并安装好了!

有人可以向我解释为什么这个阴谋集团选项在我的档案的这一点上会导致这样的问题吗?

与Haskell 2010语言规范导致此问题有何不同?

默认情况下,GHC处于Haskell 98模式,这使对标准的放松如下:

在Haskell 98模式下以及默认情况下(但在Haskell 2010模式下则不是),GHC在do表达式中使用时对布局规则的要求稍低一些。 具体地说,放宽了“嵌套上下文必须比包围上下文缩进更远的缩进”的限制,以使嵌套上下文与包围上下文处于同一级别(如果包围上下文是do表达式)。

https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/bugs.html#context-free-syntax

GHC来源中的评论进一步解释了:

严格来说,这是非标准的,但是在7.1中添加该选项之前,我们总是隐式启用它,并且将其关闭会破坏代码,因此为了保持向后兼容性,我们一直将其保留。

https://gitlab.haskell.org/ghc/ghc/blob/d0b45ac6984f245bce9de7ffcc7dad4a0046d344/compiler/main/DynFlags.hs#L2310

在Cabal文件中启用Haskell2010模式时,该错误会得到修复,并且文件的语法也会被拒绝。 因此do必须将块缩进到比封闭上下文更远的位置,

    summary (MarkIt meta blocks) = do
      summary meta
      mapM_ summary blocks
--  ^ indented

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM