首页 > 解决方案 > F# 和 Series,如何编写 Series.choose?

问题描述

我决定编写一个 Series.choose 函数,类似于我们在 Seq 上的函数,我想知道您是否认为这是编写它的最佳方式,回到 Seq,因为那里有一个函数。

let choose (f: 'K * 'V -> ('K * 'U) option) (e : Series<'K,'V>) =
        e |> Series.map (fun k v -> k, v)
          |> Series.values
          |> (Seq.choose f)
          |> Series.ofValues
          |> Series.map (fun _ v -> snd v)
          |> Series.indexWith (e |> Series.keys)

谢谢

标签: f#deedle

解决方案


mapAll几乎是您所需要的,只是签名略有不同(特别是不能更改密钥)。如果您确实需要更改密钥,它会变得更加困难,但仍然不需要通过Seq. 它还取决于您希望如何处理e.

未经测试(因为我这里没有 Visual Studio),并假设e没有缺失值,但应该给出这个想法:

let choose (f: 'K * 'V -> ('K * 'U) option) (e : Series<'K,'V>) =
    e |> Series.mapAll (fun k (Some v) -> f (k, v)) // Series<'K, ('K, 'U)> 
      |> Series.dropMissing // drops cases where f returned None
      |> fun e1 -> e1.SelectKeys (fun kvp -> fst kvp.Value.Value) // changes the keys to the ones f returned
      |> Series.mapValues snd // removes the keys from the values

推荐阅读