You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SML中is_older函数语法错误排查及布尔返回、传参问题咨询

问题解答

代码错误修正与解释

你的代码存在几处SML语法和语义错误,修正后的代码如下:

fun is_older (x: int*int*int, y: int*int*int) = 
  let 
    val r1 = #1 x  (* 第一个日期的日 *)
    val r2 = #2 x  (* 第一个日期的月 *)
    val r3 = #3 x  (* 第一个日期的年 *)
  
    val t1 = #1 y  (* 第二个日期的日 *)
    val t2 = #2 y  (* 第二个日期的月 *)
    val t3 = #3 y  (* 第二个日期的年 *)
  in
    r3 < t3 
    orelse (r3 = t3 andalso r2 < t2)
    orelse (r3 = t3 andalso r2 = t2 andalso r1 < t1)
  end

错误点说明:

  • 参数类型声明错误:SML中参数类型标注格式是变量: 类型,你写的x int*int*int_是错误的,正确写法是x: int*int*int,且参数之间用逗号分隔。
  • 缺少in/end包裹表达式:let块的结构是let 绑定 in 表达式 end,你把判断逻辑直接放在绑定后面,没有用in和end包裹,这会导致语法错误。
  • 错误的关键字与运算符:
    • SML中没有return关键字,函数的返回值就是in和end之间的表达式结果;
    • 相等比较用=而非==;
    • 逻辑与用andalso而非&&,逻辑或用orelse而非||。
  • 冗余的分支判断:可以用orelse简化嵌套的else if结构,让代码更简洁。

额外问题解答

1. SML中能否返回布尔值?

当然可以。布尔值(bool类型)是SML的基本类型之一,true和false是布尔值的直接量。函数的返回值由其最后一个表达式的类型决定,比如上面的is_older函数返回的就是bool类型。

2. 如何向函数传递参数(是否有类似Java的main函数)?

  • 在REPL中直接调用:大多数SML实现(比如SML/NJ、Poly/ML)都有交互式解释器(REPL),你可以直接输入函数调用语句,比如is_older ((1,2,2023), (3,4,2024));来测试函数。
  • 批量执行代码:如果把代码写在.sml文件中,加载文件后同样可以在REPL中调用函数。
  • 类似main函数的入口:部分SML实现支持定义入口函数。比如MLton编译器中,你可以定义:
    fun main () =
      let
        val result = is_older ((1,2,2023), (3,4,2024))
      in
        print (Bool.toString result ^ "\n")
      end
    
    然后编译时指定该函数为入口。而在SML/NJ中,你可以用val _ = ...来执行顶层代码,比如:
    val _ = print (Bool.toString (is_older ((1,2,2023), (3,4,2024))) ^ "\n")
    
    加载文件时这段代码会自动执行。

内容的提问来源于stack exchange,提问作者haffpuff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:25:25