SML/NJ中'as'关键字用法及OCaml转SML/NJ代码正确性验证
SML/NJ 中
as 关键字的用法(附OCaml示例转换) 嘿,刚好对ML家族里的as关键字熟,来帮你捋清楚SML/NJ里的用法,还有和OCaml的差异。
先看你参考的OCaml示例代码,它用as把b :: _这个子列表绑定到t,这样后续不用重复写冗长的模式:
let rec compress = function | a :: (b :: _ as t) -> if a = b then compress t else a :: compress t | smaller -> smaller;;
转换成SML/NJ的话,其实语法逻辑很接近,但SML的函数定义写法和OCaml略有不同,下面是正确的对应实现:
fun compress [] = [] | compress (a :: (b :: _ as t)) = if a = b then compress t else a :: compress t | compress smaller = smaller
小细节差异说明
- OCaml里可以用
function关键字直接启动模式匹配,而SML更常用fun搭配多分支模式定义(当然也可以用case表达式,写法更灵活)。 - 两者的
as核心功能完全一致:给某个子模式绑定一个变量名,方便后续复用,避免重复书写模式表达式。 - 上面的SML代码已经覆盖了所有情况:空列表、有重复元素的列表、无重复的短列表,和OCaml版本的行为完全一致——比如输入
[2,2,2,3,3,1,4,4],会返回[2,3,1,4]。
如果刚才你自己写的转换代码有语法问题,比如漏了分支或者模式写法不对,用上面这个版本就可以正常运行啦。
内容的提问来源于stack exchange,提问作者Tai
相关产品推荐
相关产品推荐

