F # и Series, как написать Series.choose? - PullRequest
1 голос
/ 11 марта 2019

Я решил написать функцию 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)

Спасибо

Ответы [ 2 ]

3 голосов
/ 11 марта 2019

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
0 голосов
/ 13 марта 2019

Вот что я написал для моей "Панели инструментов".На всякий случай, если это сэкономит время кому-то в будущем ...

    /// Choose only on values keeping the same keys
    let chooseV (f: 'V -> 'U option) (e : Series<'K,'V>) =
        e |> Series.mapAll (fun _ (Some v) -> f v)
          |> Series.dropMissing

    /// Choose on both keys and values, changing the keys to type 'J
    let chooseKV (f: 'K * 'V -> ('J * 'U) option) (e : Series<'K,'V>) =
        e |> Series.mapAll (fun k (Some v) -> f (k, v))
          |> Series.dropMissing
          |> fun e1 -> e1.SelectKeys (fun kvp -> fst kvp.Value.Value)
          |> Series.mapValues snd

    /// Choose on just the values using the keys in the function
    let choose (f: 'K * 'V -> ('K * 'U) option) (e : Series<'K,'V>) =
        e |> Series.mapAll (fun k (Some v) -> f (k, v))
          |> Series.dropMissing
          |> Series.mapValues snd 
...