【问题标题】:Is there a way to script a ghci session?有没有办法编写一个 ghci 会话?
【发布时间】:2017-12-10 02:36:27
【问题描述】:

我的目标是为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 会话的脚本?

【问题讨论】:

  • 您是否尝试过通过 shell 将脚本传送到 GHCi 中?例如:ghci &lt; filename。如果您只想运行一些命令然后退出,那应该可以正常工作。
  • 谢谢@JonPurdy - 我试过了 - 得到了输出,但是在很长的命令序列中,如果没有看到输入,很难看出你在哪里 - 有时会排除换行符。这会在紧要关头起作用,但我愿意接受更好的事情。

标签: bash haskell ghci


【解决方案1】:

您需要为此使用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 中设置提示。

【讨论】:

    【解决方案2】:

    感谢@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.
    $
    

    【讨论】:

      猜你喜欢
      • 2011-12-05
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 2010-10-23
      • 2015-03-11
      • 1970-01-01
      • 2014-09-19
      • 2019-10-20
      相关资源
      最近更新 更多