当我在 REPL 中运行此代码时,它会抛出Error: syntax error: inserting DOT
.我想知道该错误消息的含义。
我已经修复了代码,并且仍然想知道该消息的含义以供将来参考。
part_dir
是返回具有可能模式Left
和Right
的自定义数据类型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=dir2
在if
中。
在您的情况下,您甚至不需要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