【问题标题】:Haskell package vector-space fails at compile timeHaskell 包向量空间在编译时失败
【发布时间】:2014-03-14 06:40:51
【问题描述】:

我尝试安装 Haskell 图表库,但无法安装其中一个依赖项。由于对 haskell 没有那么丰富的经验,我不太明白如何解决这个错误。

我删除了我认为与失败的构建无关的警告 (------ warnings ommitted (-Winvalid-pp-token) -----)

[hsenv]➜ ~HSENV cabal install vector-space-0.8.5 解决依赖关系... 正在下载矢量空间-0.8.5... 配置向量空间-0.8.5... /var/folders/nq/fx4vf3v14jz9b8mldvcyv1xr0000gn/T/23218.c:1:12: 警告:控制到达非空函数的结尾 [-Wreturn-type] int foo() {} ^ 生成 1 个警告。 构建向量空间-0.8.5... 预处理库向量空间-0.8.5... ------ 忽略警告(-Winvalid-pp-token)----- src/Data/VectorSpace.hs:4:3: 错误:无效的预处理指令 #-} ^ ------ 忽略警告(-Winvalid-pp-token)----- 生成 2 个警告和 1 个错误。 安装矢量空间 0.8.5 失败 cabal:错误:某些软件包无法安装: vector-space-0.8.5 在构建阶段失败。例外是: 退出失败 1

【问题讨论】:

    标签: haskell cabal


    【解决方案1】:

    我猜你是在安装了 Xcode 5 的 OS X 上?有instructions for that

    Xcode 5 提供 Clang 作为 C 编译器,在预处理方面,它与 GCC 之间存在一些“解释差异”。这些差异会影响一些使用 CPP 扩展的 Haskell 代码。使用 Xcode 5 的用户的另一种方法是安装 GCC 并在该处直接使用 GHC。有关说明,请参阅this page

    【讨论】:

    • 顺便说一下,我在 10.8 上试过这个,但没有成功。大概它必须是 10.9。
    【解决方案2】:

    正如 Jon Purdy 所说,这与预处理有关。特别是,vector-space 中的一些模块在顶部列出了所需的语言扩展,如下所示:

    {-# LANGUAGE MultiParamTypeClasses, TypeOperators
               , TypeFamilies, UndecidableInstances, CPP
               , FlexibleContexts
     #-}
    {-# OPTIONS_GHC -Wall #-}
    ----------------------------------------------------------------------
    -- |
    -- Module      :   Data.VectorSpace
    ...
    

    {#- ... -#} 跨越多行,因此分隔符是以# 开头的行。然后触发预处理器,显然没有好的结果!

    你可以改成

    {-# LANGUAGE MultiParamTypeClasses #-}
    {-# LANGUAGE TypeOperators         #-}
    {-# LANGUAGE TypeFamilies          #-}
    {-# LANGUAGE UndecidableInstances  #-}
    {-# LANGUAGE CPP                   #-}
    {-# LANGUAGE FlexibleContexts      #-}
    

    或者可能这也可以:

    {-# LANGUAGE MultiParamTypeClasses, TypeOperators
               , TypeFamilies, UndecidableInstances, CPP
               , FlexibleContexts #-}
    

    这是一个自动执行此转换的脚本:

    import System.IO.Strict as S
    import System.Environment
    import Control.Monad
    
    rmLeadHash :: [String] -> [String]
    rmLeadHash [] = []
    rmLeadHash [l] = [l]
    rmLeadHash (l:l':ls)
      | ('#':_) <- dropWhile (==' ') l'  = (l ++ l') : rmLeadHash ls
      | otherwise                        = l : rmLeadHash (l':ls)
    
    main = do
       files <- getArgs
       forM_ files $ \f -> do
          hs <- S.readFile f
          writeFile f $ unlines . rmLeadHash . lines $ hs
    

    你可以这样做

    $ git clone git://github.com/conal/vector-space.git  # or cabal fetch vector-space
    $ cd vector-space
    $ cabal install strict     # needed for my script
    $ find src -name '*.hs' | xargs runhaskell remLeadingHashes.hs
                                      #              ^- the script I've posted
    $ cabal install     # installs the modified vector-space package
    

    如果可行,您可能需要推送更改。

    【讨论】:

    • 你能解释一下这个符号&lt;-在没有do关键字的情况下是如何在rmLeadHash中工作的吗?
    猜你喜欢
    • 2013-02-28
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2014-03-10
    相关资源
    最近更新 更多