3

当我在 REPL 中运行此代码时,它会抛出Error: syntax error: inserting DOT. 我想知道那个错误信息是什么意思。

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

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

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

2 回答 2

4

“语法错误:插入点”意味着在它抱怨的位置有一个意外的标记,并且在该位置一个点是合法的。但是,这并不意味着点是该位置唯一允许的东西,或者用点替换标记可以解决您的错误。

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

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

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

(dir1, dir2) => dir1 = dir2 andalso same (f2 :: fs)
于 2013-01-26T19:38:40.797 回答
1

另请注意,您的两个 case 表达式不会像您期望的那样工作。外壳的最后一个模式匹配实际上是内部案例的一部分。换句话说,您的代码实际上具有此含义

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 指出的错误并且您的代码编译时,您会注意到解释器吐出警告和错误。首先是内部案例的最后一个匹配是多余的错误,然后是外部案例具有非详尽匹配的警告。也就是说,它没有适用于所有可能输入的案例。

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

加上括号,您的函数将获得预期的含义

fun same (fs)=
    case fs of
      (f1::f2::fs') => (case (part_dir(f1),part_dir(f2)) of
                         (dir1=dir2) => same (f2::fs')
                       | _           => false)
    | _             => true
于 2013-01-28T01:50:22.230 回答