4

我正在尝试创建一个简单的函数,该函数采用 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

有人可以帮忙吗?

4

4 回答 4

6

除了已经提到的内容之外,您还应该使用模式匹配来分解该 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
于 2013-01-22T14:24:05.403 回答
5
val in_days1 = (#1 (date1) * 365) + (#2 (date1) * 30) + #3 date1;
val in_days2 = (#1 (date2) * 365) + (#2 (date2) * 30) + #3 date1;

局部val定义需要介于let和之间in

于 2013-01-22T14:04:56.747 回答
0

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

Error: syntax error: inserting EQUALOP

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

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

PS如果你使用letin你也必须使用end. (您不需要使用vallet解决is_older问题 - 有一种方法可以单独使用集合逻辑)。

于 2016-09-28T01:19:48.520 回答
0

它对我有用:

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
于 2018-05-06T11:55:01.513 回答