我有一个(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
有人可以帮我弄清楚为什么我会收到此错误和警告 .
关心普尼特
1 回答
警告来自使用
;
的序列组合 . 当您编写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
的参数来累积结果: