use syntax results in syntax error: replacing VAL with EQUALOP
use syntax results in syntax error: replacing VAL with EQUALOP
我正在实现一个函数,它接受两个 (int * int * int)
类型的日期:第一部分是年,第二部分是月,第三部分是日。如果第一个日期早于第二个日期,它应该 return 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
我想将测试放在一个单独的文件中,然后包含定义和 运行s 测试,就像我在上面尝试做的那样。为什么它不起作用?
有点奇怪,这是 SML 中需要分号的罕见情况之一,即使在 REPL 之外也是如此。如果您将测试文件更改为:
use "ex1.sml";
val test1 = is_older ((1,2,3),(2,3,4)) = true
然后它将按预期工作。有关 SML 中分号的更多信息,请参阅 this。
由于 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 中的错误。)
我正在实现一个函数,它接受两个 (int * int * int)
类型的日期:第一部分是年,第二部分是月,第三部分是日。如果第一个日期早于第二个日期,它应该 return 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
我想将测试放在一个单独的文件中,然后包含定义和 运行s 测试,就像我在上面尝试做的那样。为什么它不起作用?
有点奇怪,这是 SML 中需要分号的罕见情况之一,即使在 REPL 之外也是如此。如果您将测试文件更改为:
use "ex1.sml";
val test1 = is_older ((1,2,3),(2,3,4)) = true
然后它将按预期工作。有关 SML 中分号的更多信息,请参阅 this。
由于 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 中的错误。)