使用语法结果语法错误:用EQUALOP替换VAL

时间:2018-03-06 14:53:48

标签: sml ml

我正在实现一个函数,它接受(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

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

2 个答案:

答案 0 :(得分:2)

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

use "ex1.sml";

val test1 = is_older ((1,2,3),(2,3,4)) = true

那么它将按预期工作。有关SML中分号的更多信息,请参阅this

答案 1 :(得分:1)

由于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中的错误。)