我想将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有什么关系?
答案 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))
替换为矢量之间的映射以及该矢量的结果值列表