【问题标题】:F# flatten nested tuplesF# 展平嵌套元组
【发布时间】:2017-10-10 16:50:05
【问题描述】:

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

(fun ((((a0,a1),a2),b),c) ->  (a0,a1,a2,b,c))

作为说明,我从 FParsec 获得了这类元组,但如果它普遍可用,该功能会很方便。

谢谢,

【问题讨论】:

  • 在 FParsec 中,您可以使用 tuple3, tuple4, tuple5pipe3, pipe4, pipe5 函数来组合更多解析器,这可能会消除您对类似功能的需求。
  • @TheInnerLight 非常感谢

标签: f# tuples flatten


【解决方案1】:

你不能轻易做到,但稍加思考是可能的:

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

【讨论】:

  • 反射应该是绝对的最后手段;就类型安全性和性能而言,它通常很糟糕。我更愿意按照@TheInnerLight 所说的去做,并使用 FParsec 的专用功能。
  • @Tarmil 完全同意你的观点 Tarmill - 只是考虑到我对问题的表述方式 Sean 的回答是正确的。
猜你喜欢
  • 2019-03-05
  • 2020-10-04
  • 2012-11-21
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 2019-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多