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 发现了这个错误,这里是一些代码反馈:

  1. 这可能是具有命名字段的记录更适合的情况:

    type date = {year : int, month : int, day : int}
    

    这样您就不会混淆其他可互换的 int 的顺序。

    众所周知,日期格式多种多样。人们可能会认为它是 y-m-d、m-d-y 或 d-m-y。

  2. 您的函数似乎还有另一个错误:

    val test_this = is_older ((2000, 1, 1), (1999, 2, 2))
    

    但是 2000 年不早于 1999 年。

  3. 当结果是布尔值时使用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 中的错误。)