为 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)"
所以我想尝试一下,并认为我的情况可能是
-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
| ^^^^^^^^^^^
您在 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
或类似的东西。
为了在 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)"
所以我想尝试一下,并认为我的情况可能是
-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
| ^^^^^^^^^^^
您在 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
或类似的东西。