OCaml简单作业:toDec整数转低位在前数字列表的语法错误排查
代码错误定位
你写的代码存在以下几类问题,直接触发语法和逻辑报错:
- 转义字符误用:代码里的
<是HTML格式的小于号转义,OCaml编译器无法识别,需替换为<才是合法语法。 - 递归定义不匹配:外层声明的
toDec只接收1个参数i,但递归调用时传入了2个参数((i mod 10)::acc和i/10),编译器找不到匹配的函数签名。 - 语法结构错位:代码中出现的
in关键字需要搭配let变量绑定语句使用,但你没有提前定义累加器acc,括号、分号的位置完全不符合OCaml的语法规则,直接导致解析报错。 - 逻辑完全不符合作业要求:既没有处理负数返回
None的分支,也没有按照要求返回option类型,更没有适配测试用例中toDec 0 = Some []的规则(原有逻辑对0会返回Some [0],和要求不符)。
符合作业要求的实现方案
下面的实现完全匹配所有测试规则,采用尾递归写法,执行效率更高:
let toDec i = (* 输入为负数,直接返回None *) if i < 0 then None else (* 辅助尾递归函数:acc存储已经拆分好的数字列表 *) let rec aux acc n = if n = 0 then acc else aux ((n mod 10) :: acc) (n / 10) in (* 初始传入空列表作为累加器,拆分完成后包装为Some返回 *) Some (aux [] i)
测试用例匹配说明
- 输入
1234:递归逐次取余得到4、3、2、1,拼接为列表[4;3;2;1],最终返回Some [4; 3; 2; 1],和测试用例一致。 - 输入
0:直接进入递归判断n=0,返回初始传入的空列表,最终返回Some [],和测试用例一致。 - 输入
-1234:命中负数判断分支,直接返回None,和测试用例一致。
内容的提问来源于stack exchange,提问作者Vicky
相关产品推荐
相关产品推荐

