我有一个(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
有人可以帮我弄清楚为什么会收到此错误并发出警告。
此致 普尼特
答案 0 :(得分:6)
警告来自使用;
的序列组合。当您编写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 []