当我在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
答案 0 :(得分:4)
“语法错误:插入DOT”意味着在它抱怨的位置有一个意外的令牌,并且该点在该位置是合法的。但是,这并不意味着点是该位置唯一允许的位置,或者用点替换该标记会修复您的错误。
在大多数情况下,除了告诉您该位置存在语法错误之外,错误消息无用。您可能应该忽略“插入DOT”部分,因为它通常不会引导您朝着正确的方向前进。只需查看它所抱怨的行和列,并尝试找出语法错误。
在您的情况下,问题是dir1=dir2
不是合法模式。合法模式将是数据类型的构造函数,其每个参数都包含模式,变量名称为_
或模式的常量或元组。没有模式可以说“包含两个相等的元素的元组”。为此,您需要模式(dir1, dir2)
,然后dir1=dir2
中的条件if
。
在你的情况下,你甚至不需要if
。你可以写:
(dir1, dir2) => dir1 = dir2 andalso same (f2 :: fs)
答案 1 :(得分:1)
另请注意,您的两个案例表达式无法按预期运行。外壳的最后一次模式匹配实际上是内壳的一部分。换句话说,你的代码实际上具有这个含义
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
在这种情况下有其他匹配,那么同样的情况就会发生。原因是管道是通用语法,其中匹配多个模式。
使用添加的括号,您的函数将获得预期的含义
fun same (fs)=
case fs of
(f1::f2::fs') => (case (part_dir(f1),part_dir(f2)) of
(dir1=dir2) => same (f2::fs')
| _ => false)
| _ => true