【问题标题】:EQUALOP error message with SML带有 SML 的 EQUALOP 错误消息
【发布时间】:2013-01-05 18:33:26
【问题描述】:

我正在尝试创建一个简单的函数,该函数采用 int*int*int 格式的两个日期,如果第一个日期早于第二个日期,则返回。

fun is_older (date1: (int*int*int), date2: (int*int*int)) =
    val in_days1 = (#1 (date1) * 365) + (#2 (date1) * 30) + #3 date1;
    val in_days2 = (#1 (date2) * 365) + (#2 (date2) * 30) + #3 date1;

    if in_days1 < in_days2
    then true
    else false

我收到此错误:

hwk_1.sml:1.53 错误:语法错误:插入 EQUALOP

未捕获的异常编译[编译:“语法错误”]

提出于:../compiler/Parse/main/smlfile.sml:15.24-15.46

../compiler/TopLevel/interact/evalloop.sml:44.55

../compiler/TopLevel/interact/evalloop.sml:296.17-296.20

有人可以帮忙吗?

【问题讨论】:

  • 您可以将if-then-else 替换为条件in_days1 &lt; in_days2

标签: syntax sml ml


【解决方案1】:
val in_days1 = (#1 (date1) * 365) + (#2 (date1) * 30) + #3 date1;
val in_days2 = (#1 (date2) * 365) + (#2 (date2) * 30) + #3 date1;

本地val 定义需要介于letin 之间。

【讨论】:

    【解决方案2】:

    除了已经提到的,你还应该使用模式匹配来分解那个 3 元组。这样做,您还可以丢弃类型注释,因为现在很清楚这是一个 3 元组(对读者而言,但更重要的是类型系统)。

    fun is_older ((y1, m1, d1), (y2, m2, d2)) =
        let
          val days1 = y1 * 365 + m1 * 30 + d1
          val days2 = y2 * 365 + m2 * 30 + d2
        in
          days1 < days2
        end
    

    但是,您可以更聪明地执行此操作。如果您有多个处理日期的函数,您可以创建一个不错的小辅助函数toDays。在下面的示例中,我刚刚包含在 isOlder 函数中,但如果你不想隐藏它,你可以将它放在顶层或 local-declaration 中

    fun isOlder (date1, date2) =
        let
          fun toDays (y, m, d) = y * 365 + m * 30 + d
        in
          toDays date1 < toDays date2
        end
    

    【讨论】:

    • "这样做你可以扔掉那个类型注释。"无论哪种方式,类型注释都是可选的。或者您的意思是从可读性的角度来看(即现在读者很清楚,即使没有注释,参数也是元组)?
    • 嗯,我正在做这个this coursera course,我认为模式匹配将是下周的主题。但是感谢您的帮助!
    • @sepp2k,最后一部分。我将更新文本以更清楚地反映这一点。希望到现在为止,我应该给人的印象是,我现在只是一点点 SML ;)
    【解决方案3】:

    FWIW,我在同一个作业中的其他练习之一中遇到了同样的错误:

    Error: syntax error: inserting EQUALOP

    但就我而言,它发生在第一行。这让我很困惑,因为我来自 Python,错误通常发生在错误之后

    底线,我想知道的是:这个错误意味着它无法编译所写的代码。

    附:如果您使用letin,您还必须使用end。 (您不需要使用 vallet 来解决 is_older 问题 - 有一种方法可以单独使用集合逻辑)。

    【讨论】:

      【解决方案4】:

      它对我有用:

      fun is_older(diaUno : (int * int * int), diaDos : (int * int * int)) =
      
          let
      
              fun setDayNum(diaUno : (int * int * int)) =
      
                  let
                      val diaUnoInt = (#1 (diaUno) * 365) + (#2 (diaUno) * 30) + #3 diaUno
                  in
                      diaUnoInt
                  end 
      
              val dia1 = setDayNum(diaUno)
              val dia2 = setDayNum(diaDos)
      
          in
      
              if dia1 < dia2 then diaUno else diaDos
      
          end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-06
        • 2014-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多