我正在尝试创建一个简单的函数,它接受两个格式为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
有人可以帮忙吗?
答案 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
定义必须介于let
和in
之间。
答案 2 :(得分:0)
FWIW,我在同一作业的其他一个练习中得到了同样的错误:
Error: syntax error: inserting EQUALOP
但在我的情况下,它发生在第一行。这对我来说很困惑,因为我来自Python,错误通常发生在之后错误。
底线,我想知道的是:这个错误意味着它无法编写代码。
P.S。如果您使用let
和in
,则还必须使用end
。 (您不需要使用val
或let
来解决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