Ocaml函数将元组转换为列表

时间:2012-02-12 08:54:59

标签: 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

有人可以帮我弄清楚为什么会收到此错误并发出警告。

此致 普尼特

1 个答案:

答案 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 []