OCaml中改进型游程编码实现报错求助
OCaml改进型游程编码的类型匹配问题解决
问题核心
你写的改进型游程编码代码里,没有正确使用自定义类型rle_type的构造函数,同时递归辅助函数缺少初始空列表参数,导致类型不匹配警告。你的类型定义是正确的,不需要修改,只需要调整代码逻辑对类型进行正确包装。
错误原因拆解
- 类型包装错误:自定义类型
rle_type要求元素必须是One 'a或Many (int * 'a)构造的实例,但你直接把原始值h或元组(count h list, h)添加到列表,这和'a rle_type list的类型要求不匹配。 - 缺少初始参数:递归函数
aux的第二个参数enclst需要初始值,你最后调用aux时只传了第一个参数,遗漏了初始空列表[],这会导致类型推断混乱。
修正方案
- 当元素出现次数为1时,用
One h包装后加入结果列表; - 当出现次数大于1时,用
Many (count h list, h)包装后加入结果列表; - 调用
aux时补充初始空列表[]。
修正后的完整代码
type 'a rle_type = | One of 'a | Many of int * 'a (* 计算元素在列表中的出现次数 *) let count e list = List.filter (fun x -> x = e) list |> List.length (* 去重,保留每个元素的单次出现 *) let rec compress = function | a :: (b :: _ as t) -> if a = b then compress t else a :: compress t | smaller -> smaller let rle_mod list = let rec aux lst enclst = match lst with | [] -> enclst | h :: t -> match count h list with | 1 -> aux t (One h :: enclst) | n -> aux t (Many (n, h) :: enclst) in aux (List.rev list |> compress) []
验证说明
修正后的代码会将输入列表转换为'a rle_type list类型的结果:
- 单个元素会被包装为
One x; - 连续重复n次的元素会被包装为
Many (n, x)。
内容的提问来源于stack exchange,提问作者HeapUnderStop
相关产品推荐
相关产品推荐

