首页 文章

Ocaml函数将元组转换为列表

提问于
浏览
2

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

  • 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 []
    

相关问题