【问题标题】:SML Error: syntax error: inserting DOTSML 错误:语法错误:插入 DOT
【发布时间】:2013-01-10 12:31:00
【问题描述】:

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

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

part_dir 是返回自定义数据类型 direction 的函数,可能的模式为 LeftRight

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

【问题讨论】:

    标签: compiler-errors syntax-error sml smlnj


    【解决方案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
    

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • 谢谢!我认为消息本身可能不会有太大帮助,但现在我知道将其视为一般语法错误。
      猜你喜欢
      • 2013-01-31
      • 2017-11-20
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多