Многострочные команды в г


у меня возникли проблемы при вводе многострочных команд в ghci. Следующий 2-строчный код работает из файла:

addTwo :: Int -> Int -> Int
addTwo x y = x + y

но когда я вхожу в ghci, я получаю ошибки. Я также попытался поместить код внутрь :{ ... :}, но они также не работают для этого примера, потому что это просто добавление строк в одну строку, что не должно быть так.

Я использую WinGHCi, версия 2011.2.0.1

3 101

3 ответа:

большую часть времени вы можете полагаться на вывод типа, чтобы разработать подпись для вас. В вашем примере достаточно следующего:

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 и набрав :set +m:

Prelude> :set +m
Prelude> let addTwo :: Int -> Int -> Int
Prelude|     addTwo x y = x + y
Prelude| 
Prelude> addTwo 1 3
4

бум.


что здесь происходит (и я говорю в основном с вы, человек гуглить за помощью во время работы ваш путь через Узнай Ты Хаскелл) это то, что GHCI-это интерактивная среда, в которой вы меняете привязки имен функций на лету. Вы должны обернуть свои определения функции let блок, так что Хаскелл знает, что ты о том, чтобы определить что-то. Элемент :set +m материал сокращенно для многострочного :{код:} строительство.

пробелы также значимы в блоках, поэтому вам нужно отступить определение функции после определения типа на четыре пробела, чтобы учесть четыре пробела в let.

использовать let:

Prelude> :{
Prelude| let addTwo :: Int -> Int -> Int
Prelude|     addTwo x y = x + y
Prelude| :}
Prelude> addTwo 2 3
5