用于ghci和脚本的细化和重命名软件包

时间:2019-07-02 14:06:15

标签: haskell haskell-stack ghci

要在ghci中进行脚本编写和播放,我想从软件包Data.Matrix中导入matrix。 基础已经包含Data.Matrix,但来自另一个软件包:matrices

我已经可以通过PackageImports成功解决此问题: 对于ghci,我这样做:

$ stack exec --resolver lts-12.5 --package "matrix" -- ghci
Prelude> :set -XPackageImports
Prelude> import "matrix" Data.Matrix

和脚本:

#!/usr/bin/env stack
-- stack --package matrix

{-# LANGUAGE PackageImports #-}

import "matrix" Data.Matrix

main = putStrLn $ Data.Matrix.prettyMatrix 
                $ Data.Matrix.fromList 1 1 [1]

stack ghc script.hs; ./script.hs

执行

但是documentation说:“您可能不需要使用此方法。另请参见“精简和重命名模块”……”

There,建议使用例如-package "base (Data.Bool as Bool)",因此我想尝试一下,并根据自己的情况想像是

  • -package "base (Data.Matrix as Mx)"重命名我要忽略的现有名称,或者

  • -package "matrix (Data.Matrix as Mx)"为我想要的模块添加自定义名称。

但是我什至无法使示例工作:

stack exec -package "base (Data.Bool as Bool)" -- ghci
Invalid option `-package'

Did you mean this?
    --package
...

stack exec --package "base (Data.Bool as Bool)" -- ghci
The following errors occurred while parsing the build targets:
- Directory not found: (Data.Bool
- Directory not found: Bool)

stack exec -package base (Data.Bool as Bool) -- ghci
bash: syntax error near unexpected token `('

用于脚本编写

#!/usr/bin/env stack
(I've tried each of those separately)
-- stack  -package "base (Data.Bool as Bool)" 
-- stack  -package  base (Data.Bool as Bool)
-- stack --package "base (Data.Bool as Bool)"
-- stack --package  base (Data.Bool as Bool)

import Bool

main = putStrLn $ show True

不编译(stack ghc script2.hs

[1 of 1] Compiling Main             ( script2.hs, script2.o )

script2.hs:4:1: error:
    Could not find module ‘Bool’
    Use -v to see a list of the files searched for.
  |
4 | import Bool
  | ^^^^^^^^^^^

1 个答案:

答案 0 :(得分:2)

the GHC manual中找到的所有内容都直接涉及到 GHC编译器的选项,或者涉及Haskell代码本身。但是您正在使用Stack进行软件包管理,这是完全不同的野兽。 (当然,它调用了 GHC,但它的作用远不止于此。)

使用Stack时,没有理由涉足PackageImports(除非您真的需要从不同的软件包中将两个相同名称的模块一起导入!)。默认情况下,Stack会隐藏每个未明确依赖的包,因此无需重命名任何内容。只需使用正常的Stack选项来指定软件包,并在实际的Haskell中简单导入即可:

#!/usr/bin/env stack
-- stack --resolver lts-12.5 runghc --package matrix

import Data.Matrix as M

main = putStrLn . prettyMatrix
                $ M.fromList 1 1 [1]

确保stack实际上使用了解析器行,即任一行

$ chmod +x matrixtest.hs
$ ./matrixtest

$ stack matrixtest.hs

但不是stack ghc matrixtest.hs或类似的东西。