如何在OCaml中获取两个列表的产品?

jay*_*kar 5 ocaml list

我有两个清单:

let a = ["a";"b"];
let b = ["c";"d"];
Run Code Online (Sandbox Code Playgroud)

我想要一个输出列表c,例如:

c = ["a";"c";"a";"d";"b";"c";"b";"d"];
Run Code Online (Sandbox Code Playgroud)

如何在ocaml中执行它,因为列表是不可变的?我是新手.

Vic*_*let 14

您将返回一个新列表.如果你真的对列表中的笛卡尔积感兴趣,那么这应该足够了:

let cartesian l l' = 
  List.concat (List.map (fun e -> List.map (fun e' -> (e,e')) l') l)

# cartesian ["a";"b"] ["c";"d"];;
- : (string * string) list = [("a", "c"); ("a", "d"); ("b", "c"); ("b", "d")]
Run Code Online (Sandbox Code Playgroud)

如果您需要这种奇怪的扁平结构,则可以使用其他列表串联.

let flat_cartesian l l' = 
  List.concat (List.concat (
    List.map (fun e -> List.map (fun e' -> [e;e']) l') l))
Run Code Online (Sandbox Code Playgroud)


thm*_*rle 6

如果您不想使用串联,因为这不是尾递归操作,您可以使用以下命令(应该更有效):

let product l1 l2 =
  List.rev (
   List.fold_left
    (fun x a ->
      List.fold_left
       (fun y b ->
         b::a::y
       )
       x
       l2
   )
   []
   l1
 )
;;
Run Code Online (Sandbox Code Playgroud)

对于笛卡尔积,只需更改

b::a::y
Run Code Online (Sandbox Code Playgroud)

进入

(a,b)::y
Run Code Online (Sandbox Code Playgroud)