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