我有两个清单:
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)
如果您不想使用串联,因为这不是尾递归操作,您可以使用以下命令(应该更有效):
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)