将向量列表展平为具有折叠的浮动列表

时间:2014-02-05 16:51:09

标签: f#

我想将Vector3 list展平为float32 list

[Vector(1.,2.,3.);Vector(1.,2.,3.)] to [1.;2.;3.;1.;2.;3.]

我已成功完成以下功能

let rec convert_vec3 (v: Vector3 list) acc =
     match v with
     | [] -> acc
     | x :: xs-> convert_vec3 xs [x.X; x.Y;x.Z] @ acc

这与List.fold有什么关系?

3 个答案:

答案 0 :(得分:4)

convert_vec3函数的等价物将是

List.fold (fun acc (v:Vector) -> [v.X; v.Y; v.Z] @ acc) [] input

但是,正如mydogisbox提到的那样,List.collect可能会更好,因为它会以正确的顺序为您提供列表,而convert_vec3函数和List.fold等效函数将不会这样做。

List.collect (fun (v:Vector) -> [v.X;v.Y;v.Z]) input

答案 1 :(得分:3)

@mydogisbox的答案很好且有效,但您也可以使用List.fold。请注意,递归函数以相反的顺序收集值。为避免这种情况,我实际上会推荐List.foldBack

([Vector(1.,2.,3.);Vector(1.,2.,3.)], [])
||> List.foldBack (fun v acc -> v.X :: v.Y :: v.Z :: acc) 
// val it : float list = [1.0; 2.0; 3.0; 1.0; 2.0; 3.0]

答案 2 :(得分:2)

我认为你想要的是List.collect而不是List.fold

> List.collect (fun x->x |> List.map (float32)) [[1.0];[2.0];[3.0]];;
val it : float32 list = [1.0f; 2.0f; 3.0f]]

(fun x->x |> List.map (float32))替换为矢量之间的映射以及该矢量的结果值列表