F#和Series,如何编写Series.choose?

时间:2019-03-11 08:23:39

标签: f# deedle

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

 RewriteEngine On
 RewriteBase /
 RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
 RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

谢谢

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

这是我为“工具箱”编写的内容。以防万一它节省了以后给别人的时间...

    /// 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