我创建了一个包含不同类型类别的记录,但这导致 GFgfo
在编译超过 10 分钟后生成巨大的文件 (150Mb) 甚至在某些语言中崩溃。我的记录只包含 9 个元素(8 个不同的类别)。
以下面的小例子为例,假设我想使用 GF 创建一个自我介绍文本。为了生成这样的文本,我创建了一条记录并将其命名为 Person。Person 记录将包含不同的信息,例如姓名、年龄、地址、爱好、人的特征等。仅创建这个小记录就使 GF 生成了一个 1.28 Mb 的gfo
文件,编译它需要超过一秒钟的时间。
这是我的代码
摘要:test.gf
abstract Test = {
flags
startcat = Sentence;
cat
Sentence; Human;
fun
MySentence : Human -> Sentence;
Joan : Human;
}
混凝土:TestSpa.gf
concrete TestSpa of Test = open SyntaxSpa, ParadigmsSpa, Predef, DictSpa in{
lincat
Sentence = Text;
Human = Person;
lin
MySentence person = generateIntro person;
Joan = {name = "Joan" ; det = aSg_Det ; job = mkN ("Doctor") ; age = mkNumeral("22") ; hobby = bailar_V ; lastMeal = mkV2(hablar_V) ;
food = mkN ("spaghetti") ; prep = mkPrep ("at") ; location = mkN("resturant") ; meal = Lunch ; feeling = mkA("happy")};
oper
Person : Type = {name : Str ;
det : Det;
job : N ;
age : Numeral ;
hobby : V ;
lastMeal : V2 ;
food : N;
prep : Prep;
location : N;
meal : Meal;
feeling : A};
generateIntro : Person -> Text =
\per -> mkText (mkUtt (mkNP (mkDet(i_Pron)) (per.job)));
param
Meal = Breakfast | Lunch | Dinner;
}
我注意到某些类别在添加到一个记录中时会导致运行时间变长,但其他类别不会产生太大影响。
问题:
1-除了使用记录将不同的类别值保持在一起,但不使用抽象的依赖类型之外,还有其他方法吗?
2-有没有办法解决这个问题,让GF知道记录中的这些值都是需要的,但它们不会出现在每个句子中?