Почему вставка является длинной остротой, очень медленной в режиме вставки Vim?

Давайте посмотрим на ошибки:

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
23
задан Léo Léopold Hertz 준영 24 July 2014 в 15:21
поделиться

8 ответов

Если Вы вставляете его в окно терминала, Vim думает, что Вы выводите его вручную, и это попытается обновить дисплей, когда Вы идете. Можно получить доступ буферу обмена (на OS X) использование pbpaste и pbcopy команды, таким образом, можно просто сделать это в Vim:

:read !pbpaste

или в оболочке:

bash$ pbpaste | vim -

при использовании GUI Vim Вы использовали бы эти "* регистр для вставки (это - то, что контекстное меню делает):

"*P   <- in normal mode

Вставка в окно терминала обычно является плохой идеей, попытайтесь использовать pbpaste, где Вы можете.

37
ответ дан 29 November 2019 в 00:59
поделиться

Вы пробовали режим вставки? вставка набора / установила nopaste?

2
ответ дан 29 November 2019 в 00:59
поделиться

Это "нормально". Это медленно, потому что, перерисовывая текст тысячи времен являются медленными.

, Поскольку Вы вставляете длинную линию в, это постоянно - обновление дисплей (из-за того, как энергия имеет дело с текстом, или как терминал вручает текст энергии, я предполагаю).

я пытался вставить текст в энергии (использующий iTerm), и это имеет ту же проблему, это требует времени к вставке. Я попробовал :set paste и :set nowrap и все еще как медленный. Вставка строки прямо в терминал одинаково медленная

С dpaste, связывают Вас упоминание, существует ссылка простого текста, которая Вы могли просто wget и редактирование:

curl http://dpaste.com/115362/plain/ | vim -
6
ответ дан 29 November 2019 в 00:59
поделиться

если Вы: синтаксис от Вас может иногда улучшаться на месте вставка длинного однострочного файла. Примером был бы сгенерированный XML-файл машины.

можно, вероятно, отключить перерисовку энергии при вставке также, посмотрите на: он перерисовывает, но всегда стоит использовать материал командной строки, как будто Вы повторяете процедуру или подобные, можно всегда автоматизировать его со сценарием / макрос энергии

2
ответ дан 29 November 2019 в 00:59
поделиться

Я не знаю, является ли это проблемой Mac или чем-то еще, но у меня нет проблем вообще со вставкой той суммы текста в Vim. Я примерил Windows и Linux, и не видел проблем.

я успешно отредактировал файлы нескольких сотен megs (файлы журнала) в Vim (загрузка является медленной, но после того как текст прочитан, все довольно мгновенное).

1
ответ дан 29 November 2019 в 00:59
поделиться

Но если это находится в сети, необходимо было попробовать:

: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 

вместо этого.

1
ответ дан 29 November 2019 в 00:59
поделиться

Если Вы используете попытку Терминала Apple другой терминал, как iTerm. Иногда, "сборка - в" терминале не является действительно реактивной для общей задачи. Не знайте почему...

0
ответ дан 29 November 2019 в 00:59
поделиться
:read !pbpaste

Если вы используете Linux, используйте:

xsel --clipboard --output

или:

xclip -selection clipboard -o

вместо pbpaste.

17
ответ дан 29 November 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: