为 ghci 和脚本精简和重命名包

Thinning and renaming packages for ghci and scripting

为了在 ghci 中编写脚本和尝试,我想从包 matrix 中导入 Data.Matrix。 Base 已经包含 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 表示 "You probably don’t need to use this ... See also 'Thinning and renaming modules' for an alternative way ..."

There,建议使用e.g. -package "base (Data.Bool as Bool)" 所以我想尝试一下,并认为我的情况可能是

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

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
  | ^^^^^^^^^^^

您在 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 或类似的东西。