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

时间:2017-12-10 02:36:28

标签: bash haskell ghci

我的目标是为ghci管道一些步骤从bash脚本运行然后干净地退出。在线评论says使用runhaskell进行此操作。

这是我试图运行的command

ghci> import System.Random 

ghci> random (mkStdGen 100) :: (Int, StdGen) 

预期结果类似于:

(-3633736515773289454,693699796 2103410263)

当我将其放入文件randomtest.hs并使用runhaskell执行时,我收到以下错误:

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

我似乎无法使用runhaskell方法盲目执行ghci输入。

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

main = do print (random (mkStdGen 100) :: (Int, StdGen))

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

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

2 个答案:

答案 0 :(得分:4)

您希望使用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

运行此功能可以获得以下信息:

$ ./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> 

注意:您可能需要对此进行一些调整,以阻止用户在~/.ghci中设置提示。

答案 1 :(得分:0)

谢谢@SilvanMosberger - 你解决了这个问题,所以我将你的问题保留为正确。

我想概括这种方法,以便它可以加载文件中指定的指令 - 例如RandomPair.ghci,其中包含以下内容:

import System.Random 

random (mkStdGen 100) :: (Int, StdGen)  
random (mkStdGen 949488) :: (Float, StdGen)  
random (mkStdGen 949488) :: (Bool, StdGen)  
random (mkStdGen 949488) :: (Integer, StdGen) 

现在运行它的脚本看起来像文件RandomPair-ghci.bash

#!/usr/bin/env expect

log_user 0
spawn ghci
log_user 1

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

set f [open "RandomPair.ghci"]
set replcommands [split [read $f] "\n"]
close $f

foreach replcommand $replcommands {
    set replcommand1 [string map {"\"" "\\\""} $replcommand] 

    expect "ghci> "
    send -- "$replcommand1 \n"
}

expect "ghci> "
send ":quit\n"

interact

这给出了类似于:

的结果
$ ./RandomPair-ghci.bash 
GHCi, version 8.0.1: http://www.haskell.org/ghc/  :? for help
Prelude> :set prompt "ghci> "
ghci> import System.Random  
ghci>  
ghci>  
ghci> random (mkStdGen 100) :: (Int, StdGen)   
(-3633736515773289454,693699796 2103410263)
ghci> random (mkStdGen 949488) :: (Float, StdGen)   
(0.3718226,1597344447 1655838864)
ghci> random (mkStdGen 949488) :: (Bool, StdGen)   
(False,1485632275 40692)
ghci> random (mkStdGen 949488) :: (Integer, StdGen)  
(9159618695640234475,587416689 2103410263)
ghci>  
ghci>  
ghci> :quit
Leaving GHCi.
$