Почему 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!"
Другие вопросы по тегам