使用语法会导致语法错误:将 VAL 替换为 EQUALOP



我正在实现一个函数,该函数采用两个类型为(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

我想将测试放在一个单独的文件中,该文件然后包含定义并运行测试,就像我在上面尝试的那样。为什么不起作用?

有点奇怪的是,这是即使在 REPL 之外,SML 中也需要分号的罕见情况之一。如果将测试文件更改为:

use "ex1.sml";
val test1 = is_older ((1,2,3),(2,3,4)) = true

然后它将按预期工作。有关 SML 中的分号的更多信息,请参阅此处。

自从 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 中的错误。

最新更新