2015-01-21 15 views
5

Ich habe eine Funktion, um die kumulierte Summe einer Sequenz zu berechnen.Generische Null für generische Funktion

let cumsum<'T> = Seq.scan (+) 0 >> Seq.skip 1 >> Seq.toArray 

Obwohl es generic sieht, die ganze Zahl 0 macht es nicht generisch, und so kann ich nicht die Funktion mit einer Folge von Schwimmern nennen.

Gibt es eine generische Null, die meine hardcoded 0 ersetzen kann, oder vielleicht eine andere Möglichkeit, die Funktion generisch zu machen.

Antwort

9

Sie können die GenericZero primitive verwenden, aber Sie müssen Ihre Funktion inline machen und es explizit eine Funktion, da grundsätzlich Werte (jetzt Ihre Funktion in point-free style geschrieben wird) machen nicht vorgenommen werden kann in der Reihe.

let inline cumsum s = 
    s |> Seq.scan (+) LanguagePrimitives.GenericZero |> Seq.skip 1 |> Seq.toArray 

Beachten Sie, dass durch das Entfernen der Typ Parameter 'T die statischen Element Einschränkungen automatisch durch den Compiler zu entnehmen:

val inline cumsum : 
    s:seq< ^a> -> ^b [] 
    when (^b or ^a) : (static member (+) : ^b * ^a -> ^b) and 
      ^b : (static member get_Zero : -> ^b) 
2
LanguagePrimitives.GenericZero 

:)

+2

Beachten Sie, dass 'cumsum' muss vielmehr eine Inline-Funktion gemacht werden als ein Wert, um habe den beabsichtigten Effekt, dh "let inline cumsum x = x |> Seq.scan (+) LanguagePrimitives.GenericZero |> Seq.skip 1 |> Seq.toArray". – ildjarn

+0

Hatte nicht einmal bis reddit überprüfen! :) – kasperhj

+0

@ildjarn Warum ist das? – kasperhj

Verwandte Themen