计算字符串中特定字符的想法

时间:2017-11-18 16:29:40

标签: sml smlnj

我对SML很新,我试图编写一个确定字符串是否平衡的函数。 平衡字符串是: 1.一个字符串,其中"("出现次数等于")"的数量。 2.在每个前缀")"不会发生超过"("。 例如:")("不平衡,因为第二个条件不适用。

我编写了这段代码,但我收到了编译错误:

fun balanceAux(s:string , i:int , c1:int , c2:int) : bool =
    if i = size(s)-1 then
        if c1=c2 then true
            else false
    else
        if c2>c1 then false
        else
            if (str(String.sub(s,i)) = "(") then balanceAux(s,i+1,c1+1,c2)
            else
                if (str(String.sub(s,i)) = ")") then balanceAux(s,i+1,c1,c2+1);
                else balanceAux(s,i+1,c1,c2);

fun balance(t:string) : bool =
balanceAux(t,0,0,0);

我收到3个编译错误:

插入LPAREN

插入LET

在EOF找到

任何想法我做错了什么?我读到它可能与我的代码表达式有关:

如果A然后B否则如果C则D

但我无法理解我能做些什么。

1 个答案:

答案 0 :(得分:0)

你在第10行末尾有一个分散的分号。

从命令式语言到SML可能会感到奇怪,但SML中的分号实际上很少见。在您的示例中,根本不需要分号。

请注意,如果您将其复制粘贴到SML / NJ REPL中,则最后需要一个分号来告诉REPL您已完成输入。然而,这是特定于交互式SML / NJ会话。

与编译问题无关的旁注:您为平衡字符串提供的定义不是很好。条件2意味着如果输入字符串完全包含“)”,那么它是不平衡的 - 考虑只包含“)”的子字符串;很明显,这个子串比“(”。

更多地出现了“)”

也许你的意思是每个前缀,“)”不会超过“(”?