带有SML的EQUALOP错误消息

时间:2013-01-22 13:48:24

标签: syntax sml ml

我正在尝试创建一个简单的函数,它接受两个格式为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

     

../编译器/顶层/交互/ evalloop.sml:44.55

     

../编译器/顶层/交互/ evalloop.sml:296.17-296.20

有人可以帮忙吗?

4 个答案:

答案 0 :(得分: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 - 声明中

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

答案 1 :(得分:5)

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 :(得分:0)

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

Error: syntax error: inserting EQUALOP

但在我的情况下,它发生在第一行。这对我来说很困惑,因为我来自Python,错误通常发生在之后错误。

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

P.S。如果您使用letin,则还必须使用end。 (您不需要使用vallet来解决is_older问题 - 有一种方法可以单独使用set逻辑来实现。

答案 3 :(得分: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