微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

应用 Predef.eqStr:需要字符串类型的值

如何解决应用 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 举报,一经查实,本站将立刻删除。