我正在实现一个函数,它接受(int * int * int)
类型的两个日期:第一部分是年份,第二部分是月份,第三部分是日期。如果第一个日期早于第二个日期,则应返回true
。
我想测试这个功能,我遇到了问题。这是文件ex1.sml
fun is_older(d1 : (int * int * int), d2 : (int * int * int)) =
if #1 d1 < #2 d2 then
true
else if #2 d1 < #2 d2 then
true
else
#3 d1 < #3 d2
这是应该测试函数的文件ex1-test.sml
:
use "ex1.sml"
val test1 = is_older ((1,2,3),(2,3,4)) = true
每当我尝试运行最后一个文件时,通过加载REPL,我总是得到错误:Error: syntax error: replacing VAL with EQUALOP
但是,如果我将测试放在ex1.ml
中并将其加载到REPL中,则不会出现任何错误。
fun is_older(d1 : (int * int * int), d2 : (int * int * int)) =
if #1 d1 < #2 d2 then
true
else if #2 d1 < #2 d2 then
true
else
#3 d1 < #3 d2
val test1 = is_older ((1,2,3),(2,3,4)) = true
我想将测试放在一个单独的文件中,然后包含定义并运行测试,正如我上面尝试的那样。为什么不起作用?
答案 0 :(得分:2)
奇怪的是,这是一种罕见的情况,即使在REPL之外,SML中也需要使用分号。如果您将测试文件更改为:
use "ex1.sml";
val test1 = is_older ((1,2,3),(2,3,4)) = true
那么它将按预期工作。有关SML中分号的更多信息,请参阅this。
答案 1 :(得分:1)
由于John发现了这个错误,这里有一些代码反馈:
这可能是指具有命名字段的记录更适合的情况:
type date = {year : int, month : int, day : int}
这样您就不会混淆其他可互换int
的顺序。
众所周知,日期格式多种多样。人们可能认为它是y-m-d,m-d-y或d-m-y。
您的功能似乎还有另一个错误:
val test_this = is_older ((2000, 1, 1), (1999, 2, 2))
但2000年并不比1999年大。
当结果是布尔值时,使用 if-then-else 稍微多余:
fun is_older (date1 : date, date2 : date) =
#year date1 < #year date2 orelse
#month date1 < #month date2 orelse
#day date1 < #day date2
(保留2中的错误。)