1

我想做这样的事情

$ stack eval 'functionDefinedInMain $ 1 + 1' > test1.txt

但是,当我执行时,stderr告诉我

<interactive>:1:1: Not in scope: ‘functionDefinedInMain’

我还尝试将代码导入stack ghci,这让我更接近:

$ echo 'functionDefinedInMain $ 1+1' | stack ghci > test2.txt
Using main module: 1. Package `exp-proj' component exe:exp-proj with main-is file: /home/wizek/sandbox/exp-proj/exp-proj/src/Main.hs
Configuring GHCi with the following packages: exp-proj

$ cat test2.txt
GHCi, version 7.10.3: http://www.haskell.org/ghc/  :? for help
[1 of 5] Compiling Utils            ( /home/wizek/sandbox/exp-proj/exp-proj/src/Utils.hs, interpreted )
[2 of 5] Compiling Vertex           ( /home/wizek/sandbox/exp-proj/exp-proj/src/Vertex.hs, interpreted )
[3 of 5] Compiling Edge             ( /home/wizek/sandbox/exp-proj/exp-proj/src/Edge.hs, interpreted )
[4 of 5] Compiling Lib              ( /home/wizek/sandbox/exp-proj/exp-proj/src/Lib.hs, interpreted )
[5 of 5] Compiling Main             ( /home/wizek/sandbox/exp-proj/exp-proj/src/Main.hs, interpreted )
Ok, modules loaded: Utils, Vertex, Edge, Lib, Main.
*Main Edge Lib Utils Vertex> 3
*Main Edge Lib Utils Vertex> Leaving GHCi.

如您所见,输出(只是3本示例中的数字)文件被GHCi.

我希望文件的内容改为:

$ cat test2.txt
3

我怎么能

  1. 加载stack eval我文件中指定的所有项目模块以.cabal在上下文中执行代码,或者
  2. 将 GHCi 输出抑制到stdout? (我不介意 GHCi 是否会发送消息stderr

$ stack --version
Version 1.0.2, Git revision fa09a980d8bb3df88b2a9193cd9bf84cc6c419b3 (3084 commits) x86_64

编辑:添加了 unix 和 bash 标记,因为stack即使GHCi没有来自stack.

4

2 回答 2

3

in 中的-e标志ghc -e需要一个 Haskell 表达式,并且默认情况下只能访问Prelude. 您需要使用完全限定的附加功能:

stack eval 'Library.someFunc $ 1+1'
            ^^^^^^^^

但是,这仅在以下情况下有效:

  1. 该模块必须是您的的一部分,而不是您的可执行文件
  2. 表达式必须从模块中导出。

如果您只是想使用Main.xxx,请确保它Main是您库中的可见模块。这也得出结论,您不能将eval其用于仅可执行项目。但是,这可能会导致奇怪的问题。例如,GHCi 将尝试导入Main两次,一次通过可执行文件,一次通过库。

例子

$ stack new exp-eval simple
$ cd exp-eval
$ cat addition >> exp-eval.cabal
$ stack eval 'Main.main'

其中addition有以下内容:

library
  hs-source-dirs:      src 
  exposed-modules:     Main
  default-language:    Haskell2010
  build-depends:       base >= 4.7 && < 5 
于 2016-02-09T10:18:49.777 回答
0

我不太明白你想要做什么 - 你想执行 main - 然后使用

$> stack runghc ./src/Main.hs > test.txt

或者

$> stack build
$> stack exec -- modulename > test.txt

调用已编译的二进制文件。

如果您有一个在 main 中导出的函数,则最容易使用stack ghci并从内部调用该函数-如果它产​​生 aString您可以使用

writeFile "test.txt" (myfunction parameter1 parameter2)

得到想要的结果。


我以前没有使用stack eval过,但我想你必须为此在库中导出你的函数,我猜你的 cabal 文件说你只有一个可执行文件的导出 - 为了给你更多信息,我需要你的cabal文件。

于 2016-02-09T10:13:18.923 回答