-1

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

这是我要运行的命令:

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>

我需要一个提示才能朝着正确的方向前进。

我的问题是:为什么 ghci 的行为与 runHaskell 不同?

4

1 回答 1

3

ghci是一个 REPL(读取、评估、打印循环)。但是,runhaskell这与将程序编译为可执行文件然后运行它几乎相同。GHCI 允许我们运行单个函数和任意表达式,而 runhaskell 只调用主函数并解释文件,而不是编译并运行它。

正如@AJFarmar 指出的那样,GHCI 最适合用于调试和测试您正在构建的程序,而 runhaskell 是一种无需编译即可运行整个程序的好方法。

所以,要解决你的问题,我们只需要给程序一个 main 函数。ghci调用print输入到解释器中且未绑定到变量的每个表达式的结果。

所以,我们的主要功能可以是:

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

我们仍然需要 import System.Random,所以整个文件变成:

import System.Random

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

然后,我们可以按预期运行:

[~]λ runhaskell randomtest.hs 
(-3633736515773289454,693699796 2103410263)

如果我们想要来自 runhaskell 的多个命令,我们可以在 main 的 do 块中添加更多命令:

import System.Random

main = do
    print (random (mkStdGen 100) :: (Int, StdGen))
    let x = 5 * 5
    print x
    putStrLn "Hello world!"
于 2017-12-09T00:14:06.167 回答