SML 错误:语法错误:插入 DOT



当我在 REPL 中运行此代码时,它会抛出Error: syntax error: inserting DOT .我想知道该错误消息的含义。

我已经修复了代码,并且仍然想知道该消息的含义以供将来参考。

part_dir 是返回具有可能模式LeftRight的自定义数据类型direction的函数。

fun same (fs)=
    case fs of
         (f1::f2::fs') => case (part_dir(f1),part_dir(f2)) of
                               (dir1=dir2) => same (f2::fs')
                             | _           => false
        | _            => true
"

语法错误:插入 DOT"意味着在它抱怨的位置有一个意外的标记,并且在该位置使用点是合法的。但是,这并不意味着在该位置唯一允许使用点,或者用点替换令牌可以修复您的错误。

在大多数情况下,错误消息除了告诉您该位置存在语法错误外,毫无用处。您可能应该忽略"插入DOT"部分,因为它通常不会引导您朝着正确的方向前进。只需查看它抱怨的行和列,并尝试找出那里的语法错误。

在您的情况下,问题是dir1=dir2不是一种合法模式。合法模式将是数据类型的构造函数,其每个参数、变量名、_或常量或模式元组都有模式。没有模式可以说"包含两个相等元素的元组"。为此,您需要模式(dir1, dir2),然后将条件dir1=dir2if中。

在您的情况下,您甚至不需要if。你可以写:

(dir1, dir2) => dir1 = dir2 andalso same (f2 :: fs)

另请注意,您的两个大小写表达式无法按预期工作。您最后的模式匹配的外壳,实际上是内壳的一部分。换句话说,你的代码实际上有这个意思

fun same (fs)=
    case fs of
      (f1::f2::fs') => case (part_dir(f1),part_dir(f2)) of
                         (dir1=dir2) => same (f2::fs')
                       | _           => false
                       | _           => true

当修复 sepp2k 指出的错误并编译代码时,您会注意到解释器会发出警告和错误。首先是错误,即内部案例的最后一个匹配项是多余的,然后是警告,即 out 案例具有非穷举匹配项。也就是说,它没有所有可能输入的情况。

因此,在大小

写表达式两边加上括号总是一个好主意,因为如果您的函数在大小写下方有其他匹配项same也会发生相同的情况。原因是管道是匹配多个模式的常见语法。

通过添加括号,您的函数将获得预期的含义

fun same (fs)=
    case fs of
      (f1::f2::fs') => (case (part_dir(f1),part_dir(f2)) of
                         (dir1=dir2) => same (f2::fs')
                       | _           => false)
    | _             => true

最新更新