如何在OCaml中使用List.map

时间:2017-02-09 02:48:24

标签: ocaml

我在OCaml中返回[[7; 5]; [7; 3; 2]]列表。我知道OCaml中有很多List个函数。我想打印每个值,在它们之间加一个加号,就像在Python或Ruby中那样。在Python中,我使用print('+'.join(map(str,lst)))执行此操作,其中lst是列表,str是转换为字符串。我如何在OCaml中执行此操作?

控制台输入

int list list = [[7; 5]; [7; 3; 2]]

控制台输出

7 + 5
7 + 3 + 2

更新

let main num = 
    print_string "Prime Partitions Program" in
    print_linked_list (prime_part num (all_primes 2 num)) ;;

我有一个包装函数main。它调用所有3个函数来使一切工作。但是,口译员给我一个未绑定的值numprime_part是一个函数,它将控制台输入中显示的链表返回。 all_primes是一个用作prime_part输入的函数。如何将这些函数作为print_linked_list函数的输入?

3 个答案:

答案 0 :(得分:4)

这是一个打印带有加号的int list list的函数:

let pll ll =
    let pl l =
        print_endline (String.concat " + " (List.map string_of_int l))
    in
    List.iter pl ll

以下是您查找示例的方式:

val pll : int list list -> unit = <fun>
# pll [[7; 5]; [7; 3; 2]];;
7 + 5
7 + 3 + 2
- : unit = ()

答案 1 :(得分:3)

str.join方法对应于OCaml&#39; s String.concat。所以python的

"+".join(["1", "2", "3"])

映射到

String.concat "+" ["1"; "2"; "3"]

join相同,concat函数仅适用于字符串列表,因此如果我们有其他类型的值,我们应该将它们映射到字符串。与Python不同,在OCaml中没有适用于所有值的str函数,因为OCaml通常不支持所谓的ad-hoc多态。因此,对于每种类型,都有一个单独的函数将其转换为其值到字符串表示。例如,对于整数,它是string_of_int函数。那么,以下Python代码

"+".join(str(x) for x in [1, 2, 3])

可以翻译成OCaml,如下:

[1;2;3] |> List.map string_of_int |> String.concat "+"

我们可以将它概括为函数

let join string_of_element sep xs = 
  xs |> List.map string_of_element |> String.concat sep

通过这种通用功能,我们可以轻松解决您的问题:

let join_ints_with = join string_of_int
let sum_of_ints = join_ints_with "+"
let string_of_equations = join sum_of_ints "\n"
let print_equations eqs = print_endline (string_of_equations eqs)

如,

print_equations [[7; 5]; [7; 3; 2]];;
7+5
7+3+2

答案 2 :(得分:1)

首先让我们尝试一种方法来获取单个列表并使用+字符加入它。我们可以通过简单的递归来做到这一点。一种实现可能如下所示:

let join_with_plus lst =    
  let rec join lst acc =
    match lst with   
    | [] -> acc
    | n :: [] -> acc ^ (string_of_int n)
    | n :: rest -> inner_join rest (acc ^ (string_of_int n) ^ " + ")
  in join lst ""

现在我们已经掌握了这个难题,我们只需将其应用于列表中的每个列表。

在这里,我们可以使用List.fold_left函数迭代我们的列表列表,并在我们进行的过程中构建新的字符串列表。

let stringify_all_lists lst = 
  List.fold_left (fun acc lst -> (join_plus lst) :: acc) [] lst

所以我们的最终产品看起来像这样:

stringify_all_lists [[7; 5]; [7; 3; 2]]
(* string list = ["7 + 5"; "7 + 3 + 2"] *)