我正在尝试创建一个简单的函数,它接受格式为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
有人可以帮忙吗?
除了已经提到的内容之外,您还应该使用模式匹配来分解该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)
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.