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

Sml 使用语法导致语法错误:将VAL替换为EQUALOP,sml,ml,Sml,Ml,我正在实现一个函数,它包含两个int*int*int类型的日期:第一部分是年,第二部分是月,第三部分是日。如果第一个日期早于第二个日期,则应返回true 我想测试这个函数,但我遇到了一些问题。这是ex1.sml文件 每当我尝试运行最后一个文件时,通过加载REPL,我总是以以下错误结束:error:syntax error:replacement VAL with EQUALOP 但是,如果我将测试放在ex1.ml中并将其加载到REPL中,它不会给出任何错误 fun is_older(d1 : (

我正在实现一个函数,它包含两个int*int*int类型的日期:第一部分是年,第二部分是月,第三部分是日。如果第一个日期早于第二个日期,则应返回true

我想测试这个函数,但我遇到了一些问题。这是ex1.sml文件

每当我尝试运行最后一个文件时,通过加载REPL,我总是以以下错误结束:error:syntax error:replacement 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

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

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

use "ex1.sml";

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

然后它就会像预期的那样工作。有关SML中分号的更多信息,请参阅。

自从John发现该错误以来,下面是一些代码反馈:

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

type date = {year : int, month : int, day : int}
这样就不会混淆其他可互换INT的顺序

日期格式是出了名的多样化。人们可能会认为是y-m-d,m-d-y或d-m-y

您的函数似乎有另一个bug:

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.0中保存错误


是的,代码有一个bug,你是对的,代码是冗余的。谢谢你的提醒。
val test_this = is_older ((2000, 1, 1), (1999, 2, 2))
fun is_older (date1 : date, date2 : date) =
    #year date1  < #year date2 orelse
    #month date1 < #month date2 orelse
    #day date1   < #day date2