У меня проблема с вводом многострочных команд в ghci.
Следующий двухстрочный код работает с файлом:
addTwo :: Int -> Int -> Int
addTwo x y = x + y
Но когда вхожу в ghci, появляется ошибка:
<interactive>:1:1: error:
Variable not in scope: addTwo :: Int -> Int -> Int
Я также попытался поместить код внутрь :{ ... :}
, но они также не работают в этом примере, потому что это просто добавление строк в одну строку, чего не должно быть.
Я использую WinGHCi версии 2011.2.0.1
Ответы:
В большинстве случаев вы можете полагаться на вывод типа, чтобы разработать для вас подпись. В вашем примере достаточно:
Если вам действительно нужно определение с сигнатурой типа или ваше определение занимает несколько строк, вы можете сделать это в ghci:
Обратите внимание, что вы также можете сжать это в одну строку:
Вы можете узнать больше о взаимодействии с ghci в интерактивной оценке в разделе подсказок документации.
источник
let
начинает блок; записи в блоке сгруппированы по отступам; а первый непробельный символ в блоке устанавливает отступ, по которому они сгруппированы. Поскольку первый непробельный символ вlet
блоке выше - этоa
ofaddTwo
, все строки в блоке должны иметь такой же глубокий отступa
.Решите эту проблему, запустив GHCI и набрав
:set +m
:Boom.
Что здесь происходит (и я говорю в основном с вами , человеком, который ищет помощи в Google, работая над Learn You A Haskell ), так это то, что GHCI - это интерактивная среда, в которой вы меняете привязки имен функций на лету. Вы должны заключить определения функций в
let
блок, чтобы Haskell знал, что вы собираетесь что-то определить. Это:set +m
сокращение для многострочного:{
кода:}
конструкции .Пробелы также важны в блоках, поэтому вам нужно сделать отступ в определении функции после определения типа на четыре пробела, чтобы учесть четыре пробела в
let
.источник
echo ':set +m' >> ~/.ghci
чтобы сделать этот параметр постоянным.let
одна строка в первой строке, тогда все остальные не нужно делать с отступом. там, где действительно учитываются пробелы, в ваших строках не должно быть конечных пробелов. завершающий пробел считается дополнительным вводом и разбивает многострочный блок.Используйте
let
:источник
Начиная с версии 8.0.1 GHCI ,
let
больше не требуется определять функции в REPL.Так что это должно сработать для вас:
Вывод типов в Haskell обеспечивает обобщенную типизацию, которая также работает для чисел с плавающей запятой:
Если вы должны предоставить свой собственный набор текста, кажется, вам нужно использовать в
let
сочетании с многострочным вводом (используйте:set +m
для включения многострочного ввода в GHCI):Но вы получите ошибки, если попытаетесь передать что-либо, кроме a
Int
из-за неполиморфной типизации:источник
Чтобы расширить ответ Аарона Холла , по крайней мере, в версии GHCi 8.4.4 вам не нужно использовать
let
объявления типа, если вы используете:{
:}
стиль. Это означает, что вам не нужно беспокоиться о добавлении отступа из 4 пробелов в каждую последующую строку для учетаlet
, что значительно упростит ввод более длинных функций или, во многих случаях, копипасту (поскольку исходный источник, вероятно, не будет иметь правильный отступ):Обновить
В качестве альтернативы вы можете включить режим многострочного ввода
:set +m
, затем ввестиlet
его самостоятельно, нажать Enter, а затем вставить определения без необходимости отступа.Однако, похоже, это не работает с некоторыми блоками кода, такими как:
Но
:{
,:}
техник делает.источник
:{
, затем на следующей строкеlet
, затем вставить свои определения без каких-либо дополнительных отступов, а затем закрыть с помощью:}
. :) а в многострочном режиме ввода set (:set +m
) вам даже не нужны были команды фигурных скобок, пока в строках кода не было конечных пробелов.:set +m
вами можно просто использоватьlet
на собственной линии? Так что можно - это круто. Спасибо.let
новую строку нельзя. Смотрите мое редактирование.