为什么ghci的行为与runHaskell不同?

时间:2017-12-09 00:05:43

标签: bash haskell ghci runhaskell

我的目标是为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>

我需要提示朝正确的方向前进。

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

1 个答案:

答案 0 :(得分:3)

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

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

因此,为了解决您的问题,我们只需要为程序提供一个主要功能。 ghci对每个表达式的结果调用print,该表达式被输入到解释器中而不绑定到变量。

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

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

我们仍然需要导入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!"