我有一个 (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/