F#展平嵌套元组

Koe*_*ear 6 f# tuples flatten

有没有办法在F#中展平任意大小的元组而不显式映射它们?

(fun ((((a0,a1),a2),b),c) ->  (a0,a1,a2,b,c))
Run Code Online (Sandbox Code Playgroud)

作为一个注释,我从FParsec获得这些元组,但如果一般可用的话,这个功能会很方便.

谢谢,

Sea*_*ean 4

你不能轻易做到这一点,但只要稍加思考,这是可能的:

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
Run Code Online (Sandbox Code Playgroud)

因此,例如:

let s = tupleToList ((100,101,102,103),1,2,3,(4,5))
Run Code Online (Sandbox Code Playgroud)

会给你:

[100; 101; 102; 103; 1; 2; 3; 4; 5]
Run Code Online (Sandbox Code Playgroud)

注意:此答案基于此处找到的代码。

  • 不过,反思绝对是最后的手段;就类型安全性和性能而言,它通常很糟糕。我宁愿按照 @TheInnerLight 所说的那样使用 FParsec 的专用函数。 (2认同)