我的目标是为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不同?
答案 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!"