2017-05-18 1 views
3

Dies ist ein weiteres Follow-up zu Working with missing values in Deedle Time Series in F# (2)Arbeiten mit fehlenden Werten in Deedle Time Series in F # (3)

ich diese Funktion Serie map2 geschrieben haben, einen fehlenden Wert zurückkehrt, wenn entweder Eingang fehlt.

let map2series (f:'T1->'T2->'R)(series1:Series<'K,'T1 opt>)(series2:Series<'K,'T2 opt>):Series<'K,'R opt>= 
    let S = series1.Zip(series2,JoinKind.Outer) //Series<'K,('T1 opt opt * 'T2 opt opt)> 

    S |> Series.mapValues (fun (a,b) -> match (a,b) with 
              | (OptionalValue.Present(a'), OptionalValue.Present(b')) -> OptionalValue.map2 f a' b' 
              | _ -> OptionalValue.Missing) 

seit Series<'K,'T opt> erscheinen natürlich in Deedle nach .Zip oder .Join Methoden.

Wie jedoch zuvor gesehen, Series<'K,'V>bereits unterstützt fehlende Werte, so würde Ich mag die Funktion über die neu zu schreiben, im Grunde das gleiche tun würde, außer dass es dauert Series<'K,'V> als Eingänge

let map2series1 (f:'T1->'T2->'R)(series1:Series<'K,'T1>)(series2:Series<'K,'T2>):Series<'K,'R>= 
    let S = series1.Zip(series2,JoinKind.Outer) //Series<'K,('T1 opt * 'T2 opt)> 
    S |> Series.mapValues (fun (a,b) -> match (a,b) with 
              | (OptionalValue.Present(a'), OptionalValue.Present(b')) -> f a' b' 
              | _ -> None) 

Doch diese funktioniert nicht, ich habe nicht die richtige Syntax in der zweiten Union Fall, wenn ein Wert fehlt ...

grundsätzlich anstelle der letzten None, ich muss einen Wert zuweisen, der <missing> entspricht, aber ich kann nicht finden es.

Ich sah auch so etwas wie Option.bind OptionalValue.asOption OptionalValue.Missing aber den richtigen Ausdruck nicht finden können

Antwort

1

Sie es auf diese Weise tun können:

let map2 f = 
    function 
    | OptionalValue.Present(a'), OptionalValue.Present(b') -> Some (f a' b') 
    | _ -> None 

let map2series f series1 series2 = 
    series2 
    |> Series.zip series1 
    |> Series.mapAll(fun _ -> Option.bind(map2 f))