有没有办法编写 ghci 会话的脚本?

haw*_*eye 5 bash haskell ghci

我的目标是通过管道ghci从 bash 脚本运行一些步骤,然后干净地退出。网上的评论是用来runhaskell做这个的。

这是我试图运行的命令

ghci> import System.Random 

ghci> random (mkStdGen 100) :: (Int, StdGen) 
Run Code Online (Sandbox Code Playgroud)

预期结果类似于:

(-3633736515773289454,693699796 2103410263)
Run Code Online (Sandbox Code Playgroud)

当我将它放入一个文件randomtest.hs并执行它时,runhaskell我收到以下错误:。

randomtest.hs:3:1: error:
    Invalid type signature: random (mkStdGen 100) :: ...
    Should be of form <variable> :: <type>
Run Code Online (Sandbox Code Playgroud)

看来我不能用这种runhaskell方法盲目地执行ghci输入。

现在解决这个问题的方法是向传递给的文件添加额外的命令runhaskell

main = do print (random (mkStdGen 100) :: (Int, StdGen))
Run Code Online (Sandbox Code Playgroud)

我的目标是为我正在使用的 Haskell 课程自动运行 ghci 工作。我希望能够从 bash 脚本运行 ghci 命令——以 ghci 期望的格式,并让它从 ghci(或运行它的任何东西)干净地退出。

我的问题是:有没有办法编写 ghci 会话的脚本?

Sil*_*ger 6

你会想要使用expect,它允许你用简单的命令交互式地控制REPL。此脚本执行您想要的操作:

#!/usr/bin/env expect

log_user 0
spawn ghci
log_user 1

expect ".*> "
send ":set prompt \"ghci> \"\n"

expect "ghci> "
send "import System.Random\n"
expect "ghci> "
send "random (mkStdGen 100) :: (Int, StdGen)\n"

interact
Run Code Online (Sandbox Code Playgroud)

运行它会为您提供以下信息:

$ ./ghci-interactive
GHCi, version 8.0.2: http://www.haskell.org/ghc/  :? for help
Prelude> :set prompt "ghci> "
ghci> import System.Random
ghci> random (mkStdGen 100) :: (Int, StdGen)
(-3633736515773289454,693699796 2103410263)
ghci> 
Run Code Online (Sandbox Code Playgroud)

注意:您可能需要稍微调整一下以防止用户在~/.ghci.