F# flatten nested tuples

时光总嘲笑我的痴心妄想 提交于 2019-12-01 17:21:47
Sean

You can't do it easily, but with a bit of reflection it is possible:

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

So, for example:

let s = tupleToList ((100,101,102,103),1,2,3,(4,5))

Will give you:

[100; 101; 102; 103; 1; 2; 3; 4; 5]

NOTE: This answer is based on code found here.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!