带有SML的EQUALOP错误消息

Aug*_*nha 3 syntax ml sml

我正在尝试创建一个简单的函数,它接受格式为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
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

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

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

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

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

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

有人可以帮忙吗?

Jes*_*erg 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
Run Code Online (Sandbox Code Playgroud)

但是你可以做得更聪明一些.如果你有多个函数使用日期,你可以创建一个漂亮的小助手函数toDays.在下面的示例中,我刚刚包含在isOlder函数内部,但是local如果你不想将它隐藏起来,你可以把它放在顶层或者在声明中

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


sep*_*p2k 5

val in_days1 = (#1 (date1) * 365) + (#2 (date1) * 30) + #3 date1;
val in_days2 = (#1 (date2) * 365) + (#2 (date2) * 30) + #3 date1;
Run Code Online (Sandbox Code Playgroud)

本地val定义需要介于let和之间in.