Почему ghci ведет себя по-разному для запуска Хаскелла?
Моя цель - сделать несколько шагов для 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?
1 ответ
ghci
является REPL (Чтение, Eval, Print Loop). Тем не мение, runhaskell
это почти то же самое, что компилировать программу в исполняемый файл, а затем запустить его. GHCI позволяет нам запускать отдельные функции и произвольные выражения, тогда как runhaskell просто вызывает основную функцию и интерпретирует файл вместо его компиляции и запуска.
Как указывает @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, мы можем просто добавить больше в блок do в main:
import System.Random
main = do
print (random (mkStdGen 100) :: (Int, StdGen))
let x = 5 * 5
print x
putStrLn "Hello world!"