繁体   English   中英

Ocaml函数将元组转换为列表

[英]Ocaml function to convert a tuple into a list

我有一个(int *字符串)元组,我想将其隐藏到列表中。 该元组的形式为(N,E),其中N是元素E的出现次数。该函数应返回一个列表,其中包含E的N个出现。 示例如下。 假设此函数称为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

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

问候普涅特

警告来自使用的序列组合; 当您写S1 ; S2 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 [] 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM