OCaml归并排序函数编译报错Unbound value length的解决方法
解决OCaml归并排序代码中的
Unbound value length错误 你遇到的问题根源很清晰:OCaml里并没有全局的length函数,你操作的a、b、c都是数组(通过[|...|]语法定义),而获取数组长度需要调用标准库Array模块下的Array.length函数。你大概率是混淆了列表的List.length函数——OCaml对数组和列表的操作函数是分开在不同模块下的,这点需要注意区分。
修改后的完整代码
let rec mergeSort (a, i, b, j, c, k) = if i = (Array.length a) && j = (Array.length b) || k = (Array.length c) then () else if i = (Array.length a) then (c.(k) <- b.(j); mergeSort (a, i+1, b, j+1, c, k+1)) else if j = (Array.length b) then (c.(k) <- a.(i); mergeSort (a, i+1, b, j, c, k+1)) else if a.(i) < b.(j) then (c.(k) <- a.(i); mergeSort (a, i+1, b, j, c, k+1)) else (c.(k) <- b.(j); mergeSort (a, i, b, j+1, c, k+1))
验证运行效果
用你提供的输入示例测试,现在可以正常得到预期结果:
let a = [|1; 4; 7; 9|];; let b = [|2; 3; 4; 5; 6|];; let c = [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0|];; mergeSort(a, 0, b, 0, c, 0);; (* 此时c的值为 [|1; 2; 3; 4; 4; 5; 6; 7; 9; 0; 0|],符合预期 *)
另外提个小风格建议:OCaml社区通常偏好小写字母加下划线的函数命名(比如merge_sort而非mergeSort),不过这只是编码风格问题,不影响代码功能。
内容的提问来源于stack exchange,提问作者Håkon Aase Kristiansen
相关产品推荐
相关产品推荐

