F# 展平嵌套元组
F# flatten nested tuples
有没有办法在 F# 中展平任意大小的元组而不显式映射它们?
(fun ((((a0,a1),a2),b),c) -> (a0,a1,a2,b,c))
请注意,我从 FParsec 获得了这类元组,但如果它普遍可用,该功能会很方便。
谢谢,
你不能轻易做到,但稍加思考是可能的:
let isTuple tuple =
Microsoft.FSharp.Reflection.FSharpType.IsTuple(tuple.GetType())
let tupleValues (tuple : obj) =
Microsoft.FSharp.Reflection.FSharpValue.GetTupleFields tuple |> Array.toList
let rec flatten tupleFields =
tupleFields |> List.collect(fun value ->
match isTuple value with
| true -> flatten (tupleValues value)
| false -> [value]
)
let tupleToList (tuple : obj) =
if isTuple tuple
then Some (tupleValues tuple |> flatten)
else None
因此,例如:
let s = tupleToList ((100,101,102,103),1,2,3,(4,5))
会给你:
[100; 101; 102; 103; 1; 2; 3; 4; 5]
注意:此答案基于找到的代码 here。
有没有办法在 F# 中展平任意大小的元组而不显式映射它们?
(fun ((((a0,a1),a2),b),c) -> (a0,a1,a2,b,c))
请注意,我从 FParsec 获得了这类元组,但如果它普遍可用,该功能会很方便。
谢谢,
你不能轻易做到,但稍加思考是可能的:
let isTuple tuple =
Microsoft.FSharp.Reflection.FSharpType.IsTuple(tuple.GetType())
let tupleValues (tuple : obj) =
Microsoft.FSharp.Reflection.FSharpValue.GetTupleFields tuple |> Array.toList
let rec flatten tupleFields =
tupleFields |> List.collect(fun value ->
match isTuple value with
| true -> flatten (tupleValues value)
| false -> [value]
)
let tupleToList (tuple : obj) =
if isTuple tuple
then Some (tupleValues tuple |> flatten)
else None
因此,例如:
let s = tupleToList ((100,101,102,103),1,2,3,(4,5))
会给你:
[100; 101; 102; 103; 1; 2; 3; 4; 5]
注意:此答案基于找到的代码 here。