Давайте посмотрим на ошибки:
blockquote>Variable not in scope: evaluate :: t0 -> Integer -> t Data constructor not in scope: Constant
Это означает, что вы не определили функцию
evaluate
и конструкторConstant
(даже если вы явно есть). Но вы говорите, что когда вы используетеgetValue
иX
, эти работы?Это, как представляется, не является (чрезвычайно распространенной) многострочной
ghci
путаницей, как это предлагается в комментарии. Во-первых, ошибка, которую вы получаете от этого, как правило,non-exhaustive patterns
, а это не то, что вы получаете. Во-вторых, ваша подсказкаghci
читает*Main>
вместоPrelude>
, что означает, что вы:load
отредактировали файл. Указанный файл просто не определил код, который вы ожидаете получить.Я предполагаю, что вы написали первую часть кода в файле, затем
:load
отредактировали его правильно, затем изменили файл и забыли:reload
, поэтому сделанные вами изменения никогда не загружались. [1138 ]Другая возможность состоит в том, что вы поместили
module Main (VariableName (..), getValue) where
в начало вашего файла и забыли добавить в него новый экспорт. Но это кажется менее вероятным.Если ничего из вышеперечисленного не работает, попробуйте закрыть
ghci
, открыть его снова и:load
заново создать файл.
Даже после того, как вы исправите эту проблему, вы столкнетесь с рядом других ошибок, в основном связанных с круглыми скобками. В Haskell, когда вы пишете что-то вроде этого:
evaluate Constant 20
Это означает «вызовите функцию
evaluate
и передайте ей два аргумента:Constant
и20
». Это подразумеваетevaluate :: Expression -> Int -> Int
, но вы действительно хотитеevaluate :: Expression -> Int
. Поэтому вам нужны круглые скобки:evaluate (Constant 20)
Это означает, что «вызовите конструктор
Constant
с одним аргументом20
и передайте это значение в качестве единственного аргументаevaluate
».
Это изменение нужно не только вносить в сайт вызовов, оно также необходимо в определении. В настоящее время у вас есть:
evaluate :: Expression -> Int evaluate Constant x = x evaluate Variable x = getValue x evaluate Add x y = x+y evaluate Multiply x y = x * y
Каждый из этих шаблонов ожидает различное количество аргументов: первые два ожидают два аргумента, а последние два ожидают три аргумента. Проблема в том, что
x
иy
рассматриваются как аргументы функции, а не конструкторы. Чтобы изменить это, вам нужны круглые скобки:evaluate :: Expression -> Int evaluate (Constant x) = x evaluate (Variable x) = getValue x evaluate (Add x y) = x+y evaluate (Multiply x y) = x * y
Последнее изменение, которое вам нужно сделать, - это определение конструктора: вы должны сначала сказать конструкторам, что они принимают аргументы. В настоящее время ваше определение данных выглядит следующим образом (я добавил форматирование):
data Expression = Constant | Variable | Add | Multiply deriving Show
Ни один из этих конструкторов в настоящее время не принимает аргументы: это значения (например,
True
,X
,Nothing
, и т. д.), а не конструкторы значений. Это не то, что вы хотите. Вам нужно указать типы аргументов для каждого конструктора, например:data Expression = Constant Int | Variable VariableName | Add Int Int | Multiply Int Int deriving Show
Если Вы вставляете его в окно терминала, Vim думает, что Вы выводите его вручную, и это попытается обновить дисплей, когда Вы идете. Можно получить доступ буферу обмена (на OS X) использование pbpaste
и pbcopy
команды, таким образом, можно просто сделать это в Vim:
:read !pbpaste
или в оболочке:
bash$ pbpaste | vim -
при использовании GUI Vim Вы использовали бы эти "*
регистр для вставки (это - то, что контекстное меню делает):
"*P <- in normal mode
Вставка в окно терминала обычно является плохой идеей, попытайтесь использовать pbpaste
, где Вы можете.
Вы пробовали режим вставки? вставка набора / установила nopaste?
Это "нормально". Это медленно, потому что, перерисовывая текст тысячи времен являются медленными.
, Поскольку Вы вставляете длинную линию в, это постоянно - обновление дисплей (из-за того, как энергия имеет дело с текстом, или как терминал вручает текст энергии, я предполагаю).
я пытался вставить текст в энергии (использующий iTerm), и это имеет ту же проблему, это требует времени к вставке. Я попробовал :set paste
и :set nowrap
и все еще как медленный. Вставка строки прямо в терминал одинаково медленная
С dpaste, связывают Вас упоминание, существует ссылка простого текста, которая Вы могли просто wget и редактирование:
curl http://dpaste.com/115362/plain/ | vim -
если Вы: синтаксис от Вас может иногда улучшаться на месте вставка длинного однострочного файла. Примером был бы сгенерированный XML-файл машины.
можно, вероятно, отключить перерисовку энергии при вставке также, посмотрите на: он перерисовывает, но всегда стоит использовать материал командной строки, как будто Вы повторяете процедуру или подобные, можно всегда автоматизировать его со сценарием / макрос энергии
Я не знаю, является ли это проблемой Mac или чем-то еще, но у меня нет проблем вообще со вставкой той суммы текста в Vim. Я примерил Windows и Linux, и не видел проблем.
я успешно отредактировал файлы нескольких сотен megs (файлы журнала) в Vim (загрузка является медленной, но после того как текст прочитан, все довольно мгновенное).
Но если это находится в сети, необходимо было попробовать:
:e http://link/to/file
Затем при необходимости сохраняют его как локальный файл.
И если это медленно из-за перерисовки, посмотрите на эту опцию:
*'lazyredraw'* *'lz'* *'nolazyredraw'* *'nolz'*
'lazyredraw' 'lz' boolean (default off)
global
{not in Vi}
When this option is set, the screen will not be redrawn while
executing macros, registers and other commands that have not been
typed. Also, updating the window title is postponed. To force an
update use |:redraw|.
И если это - локальный файл, затем вставка не необходима: попробуйте
:read file
вместо этого.
Если Вы используете попытку Терминала Apple другой терминал, как iTerm. Иногда, "сборка - в" терминале не является действительно реактивной для общей задачи. Не знайте почему...
:read !pbpaste
Если вы используете Linux, используйте:
xsel --clipboard --output
или:
xclip -selection clipboard -o
вместо pbpaste.