Константа не найдена: перегрузка в 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) ;
  } ;

}
Другие вопросы по тегам