获取OCaml中两个列表之间的距离

获取OCaml中两个列表之间的距离,ocaml,Ocaml,假设我们有两个列表,[3;4;5]和[1;2;3],如何得到12的距离,这是通过从第一个列表中减去第二个列表,然后平方得到的。所以(3-1)^2+(4-2)^2+(5-3)^2。目前,我有以下方法来解决这个问题: List.map (List.map (fun x -> x*x)) [[1; 2]; [2; 3]];; 但是我怎样才能把它们加在一起呢?上面的序列只返回[[1;4];[4;9]] 谢谢。借用下列整数幂函数: 你的例子是: utop[58]> distance [3;4

假设我们有两个列表,[3;4;5]和[1;2;3],如何得到12的距离,这是通过从第一个列表中减去第二个列表,然后平方得到的。所以(3-1)^2+(4-2)^2+(5-3)^2。目前,我有以下方法来解决这个问题:

List.map (List.map (fun x -> x*x)) [[1; 2]; [2; 3]];;
但是我怎样才能把它们加在一起呢?上面的序列只返回[[1;4];[4;9]]


谢谢。

借用下列整数幂函数:

你的例子是:

utop[58]> distance [3;4;5] [1;2;3];;
- : int = 12

map的结果是一个列表,因此必须将其缩减为整数。 使用库执行此操作的简单方法是使用List.fold_left

# let distance a b = List.fold_left (fun s -> fun x -> s + x * x) 0 (List.map2 (-) a  b);;
val distance : int list -> int list -> int = <fun>
# distance [3; 4; 5] [1; 2; 3];;
- : int = 12

您可以折叠两个列表:


让距离=List.fold_left2(乐趣s x y->s+(x-y)*(x-y))0

要获得差异:

let difs = List.map2 (fun a b -> a - b) [3;4;5] [1;2;3]
要计算这些值的平方:

let difs' = List.map (fun x -> x * x) difs
要获得结果总和,请执行以下操作:

let res = List.fold_left (+) 0 difs'
作为一项功能:

let list_dist l1 l2 =
  List.map2 (fun a b -> a - b) l1 l2
  |> List.map (fun x -> x * x)
  |> List.fold_left (+) 0

大概OCaml有一个zip函数。将列表压缩到有序对列表中,然后将减法映射到映射平方,然后对结果求和。@JohnColeman stdlib中没有Zip函数,stdlib非常小。@edgararroutiounian这很奇怪。我总是模糊地认为O'Caml是ML+对象。对于SML,这个问题相当简单。
zip
在OCaml中被称为
List.combine
。但是,您可能只使用
list.map2
(或
list.fold2
)而不是构建一个中间列表。知道您只使用2,
pow
有点过分,一个
square
函数就足够了。
let res = List.fold_left (+) 0 difs'
let list_dist l1 l2 =
  List.map2 (fun a b -> a - b) l1 l2
  |> List.map (fun x -> x * x)
  |> List.fold_left (+) 0