Ocaml函数将元组转换为列表

ppa*_*l74 2 ocaml list

我有一个(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"]
Run Code Online (Sandbox Code Playgroud)

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 
;;
Run Code Online (Sandbox Code Playgroud)

当我尝试编译此函数时,我收到以下错误.

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
Run Code Online (Sandbox Code Playgroud)

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

问候普纳特

pad*_*pad 6

警告来自序列组合使用;.在编写时S1 ; S2,编译器期望S1具有unit类型.但是这里S1返回一个list(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 [] 
Run Code Online (Sandbox Code Playgroud)

  • 另外,值得注意的是,对于警告部分,如果`S1`没有类型`unit`,那么结果将被丢弃.因此,如果您不将累加器作为参数传递给函数,则递归调用是无用的. (2认同)