Haskell Language
Использование GHCi
Поиск…
замечания
GHCI - это интерактивный REPL, который поставляется вместе с GHC.
Запуск GHCi
Введите ghci
в командной строке для запуска GHCI.
$ ghci
GHCi, version 8.0.1: http://www.haskell.org/ghc/ :? for help
Prelude>
Изменение приглашения по умолчанию GHCi
По умолчанию приглашение GHCI отображает все модули, которые вы загрузили в свой интерактивный сеанс. Если у вас много загруженных модулей, это может затянуться:
Prelude Data.List Control.Monad> -- etc
Команда :set prompt
изменяет приглашение для этого интерактивного сеанса.
Prelude Data.List Control.Monad> :set prompt "foo> "
foo>
Чтобы изменить приглашение навсегда, добавьте :set prompt "foo> "
в файл конфигурации GHCi .
Файл конфигурации GHCi
GHCi использует файл конфигурации в ~/.ghci
. Конфигурационный файл состоит из последовательности команд, которые GHCi будет выполнять при запуске.
$ echo ":set prompt \"foo> \"" > ~/.ghci
$ ghci
GHCi, version 8.0.1: http://www.haskell.org/ghc/ :? for help
Loaded GHCi configuration from ~/.ghci
foo>
Загрузка файла
Команда :l
или :load
- проверяет и загружает файл.
$ echo "f = putStrLn \"example\"" > example.hs
$ ghci
GHCi, version 8.0.1: http://www.haskell.org/ghc/ :? for help
ghci> :l example.hs
[1 of 1] Compiling Main ( example.hs, interpreted )
Ok, modules loaded: Main.
ghci> f
example
Выход из GHCi
Вы можете оставить GHCi просто с помощью :q
или :quit
ghci> :q
Leaving GHCi.
ghci> :quit
Leaving GHCi.
Альтернативно, сочетание клавиш CTRL + D ( Cmd + D для OSX) имеет тот же эффект, что и :q
.
Перезагрузка уже загруженного файла
Если вы загрузили файл в GHCi (например, с помощью :l filename.hs
), и вы изменили файл в редакторе вне GHCi, вы должны перезагрузить файл с помощью :r
или :reload
, чтобы использовать изменения, следовательно вам больше не нужно вводить имя файла.
ghci> :r
OK, modules loaded: Main.
ghci> :reload
OK, modules loaded: Main.
Точки останова с GHCi
GHCi поддерживает точки прерывания по требованию из коробки с интерпретированным кодом (код, который был :loaded
).
Со следующей программой:
-- mySum.hs
doSum n = do
putStrLn ("Counting to " ++ (show n))
let v = sum [1..n]
putStrLn ("sum to " ++ (show n) ++ " = " ++ (show v))
загружен в GHCi:
Prelude> :load mySum.hs
[1 of 1] Compiling Main ( mySum.hs, interpreted )
Ok, modules loaded: Main.
*Main>
Теперь мы можем установить точки останова, используя номера строк:
*Main> :break 2
Breakpoint 0 activated at mySum.hs:2:3-39
и GHCi остановится в соответствующей строке, когда мы запустим функцию:
*Main> doSum 12
Stopped at mySum.hs:2:3-39
_result :: IO () = _
n :: Integer = 12
[mySum.hs:2:3-39] *Main>
Это может сбивать с толку, где мы находимся в программе, поэтому мы можем использовать :list
для уточнения:
[mySum.hs:2:3-39] *Main> :list
1 doSum n = do
2 putStrLn ("Counting to " ++ (show n)) -- GHCi will emphasise this line, as that's where we've stopped
3 let v = sum [1..n]
Мы можем печатать переменные и продолжать выполнение:
[mySum.hs:2:3-39] *Main> n
12
:continue
Counting to 12
sum to 12 = 78
*Main>
Многострочные операторы
Команда :{
начинает многострочный режим и :}
завершает ее. В многострочном режиме GHCi интерпретирует новые строки как точки с запятой, а не как конец инструкции.
ghci> :{
ghci| myFoldr f z [] = z
ghci| myFoldr f z (y:ys) = f y (myFoldr f z ys)
ghci| :}
ghci> :t myFoldr
myFoldr :: (a -> b -> b) -> b -> [a] -> b