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而非||。
- SML中没有
- 冗余的分支判断:可以用
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编译器中,你可以定义:
然后编译时指定该函数为入口。而在SML/NJ中,你可以用fun main () = let val result = is_older ((1,2,2023), (3,4,2024)) in print (Bool.toString result ^ "\n") endval _ = ...来执行顶层代码,比如:
加载文件时这段代码会自动执行。val _ = print (Bool.toString (is_older ((1,2,2023), (3,4,2024))) ^ "\n")
内容的提问来源于stack exchange,提问作者haffpuff
相关产品推荐
相关产品推荐

