如何解决应用 Predef.eqStr:需要字符串类型的值
我试图编写一个采用不确定数量参数的操作,因此如果用户选择不填充其中一个参数,那么操作员会更改其功能。
oper
gen_NP = overload{
gen_NP : N -> NP =
\noun ->
mkNP(noun);
gen_NP : Str -> N -> NP =
\mdfir,noun ->
mkNP(mkN(mdfir) (noun));
....
}
但是在这种方法中编写每个新的未确定参数都会产生大量的重载。 所以我用了这个方法
oper
gen_NP : {noun : N ; mdfir : Str ; ....} -> NP =
\obj
case eqStr (obj.mdfir) ("") of {
PFalse =>
mkNP(mkN(mdfir) (noun));
PTrue =>
mkNP(noun);
};
}
当我尝试第二种方法时,程序不断报告: 应用 Predef.eqStr:期望字符串类型的值,得到 VP (VGen 1 []) (LIdent(Id{rawId2utf8 = "mdfir"}))
有没有办法解决这个问题,或者有没有更好的方法来处理不确定数量的参数?
谢谢
解决方法
重载操作的最佳实践
大量的重载是预期的做事方式。只需查看 RGL synopsis 中的任何类别,您就可以轻松看到单个函数名称的 20 多个重载。定义它们可能很烦人,但这是您只需要做一次的事情。然后当你使用你的重载时,像这样使用它们会更好:
int _tmain(int argc,LPTSTR argv[])
{
using std::copy;
using std::tcout;
using std::tcin;
constexpr int size = 1024;
TCHAR fileName[size];
#ifdef UNICODE
_setmode(_fileno(stdin),_O_WTEXT);
_setmode(_fileno(stdout),_O_WTEXT);
#endif
if (argc > 1)
{
copy(&argv[1][0],&argv[1][1023],fileName); //is this copy ok?
}
else
{
tcout << "Program name: ";
tcin >> fileName;
}
tcout << fileName;
}
而不是被迫对每件事都给出两个论点:
myRegularNoun = mkN "dog" ;
myIrregNoun = mkN "fish" "fish" ;
因此,拥有多个 myRegularNoun = mkN "dog" "" ;
myIrregNoun = mkN "fish" "fish" ;
实例是一项功能,而不是错误。
如何修复您的代码
我不建议使用像 mkN
这样的 Predef 函数,除非您真的知道自己在做什么。对于大多数需要检查字符串的情况,可以使用标准模式匹配语法。这是修复您的功能的方法:
eqStr
在 GF shell 中测试,首先使用 oper
gen_NP : {noun : N ; mdfir : Str} -> NP = \obj ->
case obj.mdfir of {
"" => mkNP obj.noun ;
_ => mkNP (mkN obj.mdfir obj.noun)
} ;
:
mdfir=""
现在在 mdfir 中有一些非空字符串:
> cc -unqual -table gen_NP {noun = mkN "dog" ; mdfir = ""}
s . NCase Nom => dog
s . NCase Gen => dog's
s . NPAcc => dog
s . NPNomPoss => dog
a . AgP3Sg Neutr
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。