【问题标题】:use syntax results in syntax error: replacing VAL with EQUALOP使用语法导致语法错误:将 VAL 替换为 EQUALOP
【发布时间】:2018-03-07 18:56:23
【问题描述】:

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

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

【问题讨论】:

    标签: sml ml


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      由于John发现了这个bug,下面是一些代码反馈:

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

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

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

        众所周知,日期格式多种多样。人们可能会认为是 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 中的错误。)

      【讨论】:

      • 是的,代码存在错误,您说得对,代码本身就是多余的。感谢您的提醒。
      猜你喜欢
      • 2015-06-01
      • 1970-01-01
      • 2017-06-07
      • 2012-03-12
      • 1970-01-01
      • 2020-04-19
      • 1970-01-01
      • 2021-11-06
      相关资源
      最近更新 更多