Многострочные команды в GHCi
У меня возникла проблема с вводом многострочных команд в ghci.
Следующий 2-строчный код работает из файла:
addTwo :: Int -> Int -> Int
addTwo x y = x + y
Но когда я вхожу в ghci, я получаю ошибки. Я также попытался поместить код внутри :{ ... :}
, но они также не работают для этого примера, потому что это просто добавление строк в одну строку, что не должно быть.
Я использую WinGHCi, версия 2011.2.0.1
Ответы
Ответ 1
В большинстве случаев вы можете полагаться на вывод типа для разработки подписи для вас. В вашем примере достаточно:
Prelude> let addTwo x y = x + y
Если вам действительно нужно определение с сигнатурой типа, или ваше определение охватывает несколько строк, вы можете сделать это в ghci:
Prelude> :{
Prelude| let addTwo :: Int -> Int -> Int
Prelude| addTwo x y = x + y
Prelude| :}
Prelude> addTwo 4 7
11
Обратите внимание, что вы также можете сжать его на одну строку:
Prelude> let addTwo :: Int -> Int -> Int ; addTwo x y = x + y
Вы можете узнать больше о взаимодействии с ghci в разделе Интерактивная оценка в строке документации.
Ответ 2
Решите эту проблему, включив GHCI и набрав :set +m
:
Prelude> :set +m
Prelude> let addTwo :: Int -> Int -> Int
Prelude| addTwo x y = x + y
Prelude|
Prelude> addTwo 1 3
4
Boom.
Что происходит здесь (и я говорю в основном о вам, человек, ищущий помощь в поиске работы, Learn You A Haskell) заключается в том, что GHCI - это интерактивная среда, в которой вы меняете привязки имен функций на лету. Вы должны обернуть определения функций в блоке let
, чтобы Haskell знал, что вы собираетесь что-то определить. Материал :set +m
является сокращением для многострочной конструкции :{
code :}
.
Пробелы также значительны в блоках, поэтому вам нужно отложить определение своей функции после определения типа четырьмя пробелами для учета четырех пробелов в let
.
Ответ 3
Используйте let
:
Prelude> :{
Prelude| let addTwo :: Int -> Int -> Int
Prelude| addTwo x y = x + y
Prelude| :}
Prelude> addTwo 2 3
5