Syntax 带有SML的EQUALOP错误消息

Syntax 带有SML的EQUALOP错误消息,syntax,sml,ml,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 dat

我试图创建一个简单的函数,它接受两个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
fun(日期1:(int*int*int),日期2:(int*int*int))=
val in#u days1=(#1(date1)*365)+(#2(date1)*30)+#3 date1;
val in#u days2=(#1(日期2)*365)+(#2(日期2)*30)+#3日期1;
如果in_days1
我得到这个错误:

hwk_1.sml:1.53错误:语法错误:插入等式

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

在以下地址引发:../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

有人能帮忙吗

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

中的
之间。除了前面提到的以外,还应该使用模式匹配来分解该3元组。这样做,您还可以扔掉类型注释,因为现在很清楚这是一个3元组(对于读者来说都是如此,但更重要的是对于类型系统来说也是如此)


FWIW,我在同一个家庭作业中的另一个练习中犯了同样的错误:

错误:语法错误:插入EQUALOP

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

总之,我想知道的是:这个错误意味着它无法按照编写的方式编译代码

注意:如果您在
中使用
,您还必须使用
结束
。(您不需要使用
val
let
来解决
is_\u older
问题-有一种方法可以单独使用设置逻辑来解决)

这对我很有效:

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
fun更老(diaUno:(int*int*int),diaDos:(int*int*int))=
让
funsetdaynum(diaUno:(int*int*int))=
让
val diaUnoInt=(#1(diaUno)*365)+(#2(diaUno)*30)+3 diaUno
在里面
迪亚乌内特
结束
val dia1=setDayNum(diaUno)
val dia2=setDayNum(diaDos)
在里面
如果dia1
if-then-else
你可以替换你的
in_days1
“这样做你可以扔掉类型注释。”无论哪种方式,类型注释都是可选的。或者你的意思是从可读性的角度来看(也就是说,读者现在很清楚,即使没有注释,参数也是元组)?嗯,我正在这样做,我想模式匹配将是下周的主题。但是谢谢你的帮助@sepp2k,最后一部分。我将更新文本,以更清楚地反映这一点。希望到现在为止,我应该给人的印象是,我现在只是一点点SML;)
fun isOlder (date1, date2) =
    let
      fun toDays (y, m, d) = y * 365 + m * 30 + d
    in
      toDays date1 < toDays date2
    end
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