Константа не найдена: перегрузка в GF
Я пытался сделать перегрузку функции, созданной мной на GF, но после использования функции перегрузки я продолжаю получать это сообщение об ошибке.
Использую ли я эту функцию GF неправильно или есть какие-либо новые обновления для этой функции.
Вот что я пытался сделать
Sentence = sentence(mkN(“random”));
oper
sentence:overload {
sentence:N-> Utt =
\noun->
mkUtt(mkNP(noun));
sentence:V-> Utt =
\ verb->
mkutt(mkImp(mkV2(verb)));
};
Спасибо ~
2 ответа
Похоже, ваш код представляет собой фрагмент, поэтому может быть несколько вещей, мешающих компиляции вашей грамматики.
Для начала, если вы посмотрите документацию , вы увидите, что есть две формы для операций перегрузки.
Вы используете синтаксис, чтобы указать типы для определения операций. Вместо этого вы должны использовать этот существующий код с синтаксисом для определения операций.
oper sentence = overload {...} ;
Синтаксис, который вы используете, следует использовать для определения ваших типов перед выполнением операции перегрузки.
Странные символы юникода
В этом образце много ошибок. Во-первых, кажется, что вы написали это в текстовом процессоре, а не в текстовом редакторе, потому что символы не такие, какими должны быть. Например, это настоящее двоеточие, а в фрагменте кода
:
, который представляет собой другую кодовую точку Unicode. Посмотрите на них рядом:
:: -- first the wrong one, followed by the correct one
:: -- The wrong colon includes more space
:: -- the right colon is thicker and less space
Решение этой проблемы - программировать в текстовом редакторе (например, Atom или Sublime) или в программной среде IDE (например, в VS code), а не в текстовом процессоре. Во многих редакторах нет подсветки синтаксиса для GF, но в этом видео вы можете увидеть, как вместо этого использовать режим Haskell.
Актуальная проблема
Теперь предположим, что мы исправили символы, тогда у нас есть это.
sentence : overload {
sentence : N -> Utt =
\noun -> mkUtt (mkNP noun) ;
sentence : V -> Utt =
\verb -> mkUtt something_NP ; -- the original had an unrelated bug
} ;
Теперь мы получаем описанную вами ошибку. Решение - изменить первый
:
к
=
, так:
sentence = overload { -- = used to be :
{- sentence : N -> Utt = -- the rest unchanged
\noun -> mkUtt (mkNP noun) ;
sentence : V -> Utt =
\verb -> mkUtt something_NP ; -- the original had an unrelated bug
} ; -}
Рабочая версия всего
Как сказала Паула, ваш пример - это просто фрагменты. Вот минимальная полностью рабочая версия.
abstract Sentences = {
cat
S ;
fun
Sentence : S ;
}
А вот конкретный, в котором все странные символы Unicode заменены на настоящие. Я также исправил экземпляр для: если вы видите здесь в синопсисе , нет
mkImp
например для сингла, это либо
V
или же
V2
и
NP
.
concrete SentencesEng of Sentences = open SyntaxEng, ParadigmsEng in {
lincat
S = Utt ;
lin
Sentence = sentence (mkN "random") ;
oper
sentence = overload {
sentence : N -> Utt =
\noun -> mkUtt (mkNP noun) ;
sentence : V -> Utt =
\verb -> mkUtt (mkImp (mkV2 verb) something_NP) ;
} ;
}