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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 23:52:42