2015-01-21 48 views
5

我有一個函數來計算一個序列的累計和。通用函數的通用零點

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

雖然它看起來一般,整數0使得非通用,因此我不能叫浮筒序列中的功能。

是否有一個通用的零可以替代我的硬編碼0,或者可能是一種通用的功能的不同方式。

回答

9

可以使用GenericZero原始的,但你需要讓你的內聯函數,使之明確的功能(現在你的函數寫在point-free style)因爲原則值不能進行一致。

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

。注意,通過去除所述類型參數'T靜態成員約束由編譯器自動推斷出:

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

注意,'cumsum'必須按順序進行的內聯函數,而不是一個值,以具有預期的效果,即'let inline cumsum x = x |> Seq.scan(+)LanguagePrimitives.GenericZero |> Seq.skip 1 |> Seq.toArray'。 – ildjarn 2015-01-21 10:01:07

+0

甚至沒有直到檢查reddit! :) – kasperhj 2015-01-21 10:02:02

+0

@ildjarn這是爲什麼? – kasperhj 2015-01-21 10:04:13