Многострочные команды в 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