gpt4 book ai didi

f# - 避免 F# 中的代码重复

转载 作者:行者123 更新时间:2023-12-04 01:53:13 24 4
gpt4 key购买 nike

我有两个代码片段试图将浮点列表转换为 Vector3 或 Vector2 列表。这个想法是一次从列表中取出 2/3 个元素并将它们组合为一个向量。最终结果是一系列向量。

    let rec vec3Seq floatList =
seq {
match floatList with
| x::y::z::tail -> yield Vector3(x,y,z)
yield! vec3Seq tail
| [] -> ()
| _ -> failwith "float array not multiple of 3?"
}

let rec vec2Seq floatList =
seq {
match floatList with
| x::y::tail -> yield Vector2(x,y)
yield! vec2Seq tail
| [] -> ()
| _ -> failwith "float array not multiple of 2?"
}

代码看起来非常相似,但似乎没有办法提取公共(public)部分。有任何想法吗?

最佳答案

这是一种方法。我不确定这到底有多简单,但它确实抽象了一些重复的逻辑。

let rec mkSeq (|P|_|) x =
seq {
match x with
| P(p,tail) ->
yield p
yield! mkSeq (|P|_|) tail
| [] -> ()
| _ -> failwith "List length mismatch" }

let vec3Seq =
mkSeq (function
| x::y::z::tail -> Some(Vector3(x,y,z), tail)
| _ -> None)

关于f# - 避免 F# 中的代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2259883/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com