我在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个函数来使一切工作。但是,口译员给我一个未绑定的值num
。 prime_part
是一个函数,它将控制台输入中显示的链表返回。 all_primes
是一个用作prime_part
输入的函数。如何将这些函数作为print_linked_list
函数的输入?
答案 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"] *)