修复你的代码
您的代码不起作用有几个原因:
- 返回类型必须是一个类别,但是
verbalN
是一个操作符。所以应该是这样compVerbalN : Str -> Str -> N
,或者更确切地说compVerbalN : V -> Str -> N
。
- 在函数体中,您错误地使用了参数。
- 您尝试访问 and 的字段
s
,但根据类型签名,它们是字符串,而不是具有命名字段的记录。x
y
- 您尝试将
verbalN
字符串作为参数,但实际上它需要一个V
.
让我们假设为了练习,你想要这个类型签名,Str -> Str -> N
. 然后你需要做这样的事情:
compVerbalN : Str -> Str -> N = \turning,on ->
let turning_N : N = mkN turning ;
in turning_N ** {
s = \\num,cas => turning_N.s ! num ! cas ++ on
} ;
在 GF shell 中测试:
> cc -table compVerbalN "turning" "on"
g . Neutr
s . Sg => Nom => turning on
s . Sg => Gen => turning's on
s . Pl => Nom => turnings on
s . Pl => Gen => turnings' on
这会产生正确的结果,但像这样戳穿 GF 类别的内部结构是有风险的。RGL API 是固定的,但是 RGL 的实现细节总是可以改变的,比如一些表有什么参数以及调用什么字段名。因此,如果可以仅使用 RGL API 构建某些东西,那么您应该这样做。
如何使用 RGL
要构造助词动词,您需要使用 ParadigmsEng 构造函数partV
,它具有以下类型签名:
partV : V -> Str -> V -- with particle, e.g. switch + on
如果你的动词结构正确,那么verbalN
应该产生正确的名词。这是一个例子:
resource Test = open SyntaxEng, ParadigmsEng in {
oper
turn_on_V : V = partV (mkV "turn") "on" ;
turning_on_N : N = verbalN turn_on_V ;
}
在 GF shell 中测试(之后i -retain Test.gf
):
> cc -table turning_on_N
g . Neutr
s . Sg => Nom => turning on
s . Sg => Gen => turning's on
s . Pl => Nom => turnings on
s . Pl => Gen => turnings' on
更新您的 RGL
在回答这个问题时,我注意到verbalN
最初并没有包含粒子,所以我在几分钟前的提交中添加了它。所以为了看到那个输出,你需要更新你的 RGL。
如果无法更新您的 RGL(例如,您在无法安装东西的学校计算机上工作),那么您将需要使用compVerbalN
此答案开头的结构。