list - 将元组转换为列表的 Ocaml 函数

标签 list ocaml

我有一个 (int * string) 元组,我想将其转换为列表。元组的形式为 (N, E),其中 N 是元素 E 出现的次数。 该函数应返回一个列表,其中包含 N 次出现的 E。示例如下。让我们假设这个函数叫做 tuple_decode。

tuple_decode (1, "A") -> ["A"]
tuple_decode (2,"B") -> ["B";"B"]
tuple_decode (4,"C") - > ["C";"C";"C";"C"]

tuple_decode函数如下

let tuple_decode acc (n,elem)   = 
let add_one_elem i = 
    match i  with
           0 -> acc
         | i -> elem :: acc ; add_one_elem (i-1)  (* Line 184 *)
in
add_one_elem n 
;;

当我尝试编译此函数时,出现以下错误。

File "all_code.ml", line 184, characters 11-22:
Warning 10: this expression should have type unit.
File "all_code.ml", line 184, characters 25-37:
Error: Unbound value add_one_elem

谁能帮我弄清楚为什么会出现此错误和警告。

问候 普尼特

最佳答案

警告来自使用 ; 的序列组合。当你写 S1 ; S2,编译器期望 S1 具有 unit 类型。但此处 S1 返回一个列表 (elem::acc) ,其值将被丢弃。此外,由于您没有将 acc 作为参数传递,因此它的值在所有递归调用后都不会改变。

错误是由于 add_one_elem 的递归使用。因为你没有使用 rec 关键字,当 add_one_elem (i-1) 被调用时,OCaml 不知道 add_one_elem 被递归定义.

此外,acc应该是add_one_elem的一个参数,用于累加结果:

let tuple_decode (n, elem) = 
  let rec add_one_elem i acc = 
      match i  with
      | 0 -> acc
      | i -> add_one_elem (i-1) (elem::acc)
  in add_one_elem n [] 

关于list - 将元组转换为列表的 Ocaml 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9247566/

相关文章:

ocaml - 是否可以使用 oasis 生成推断的 mli 文件?

parsing - 执行语义操作时 Ocamlyacc token 不可见

unit-testing - 在 OCaml 中为模块编写单元测试的正确方法

python - for 列表中的循环 - 替换为列表中的位置

javascript - AppleScript:在 javascript 中循环

java - 如何对 arrayList 中的值求和

unix - 如何在 OCaml 中使用 Unix.create_process 真正创建一个进程?

python - 使用用户输入查找列表中的元素

android - 列表未在 android 中显示

Ocaml 类型推断不正确