通用函数的通用零

时间:2015-01-21 09:54:08

标签: f# inline

我有一个函数来计算序列的累积和。

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

虽然它看起来很通用,但整数0使它成为非泛型的,因此我无法用浮点序列调用该函数。

是否存在可以替换我的硬编码0的通用零,或者可能是使函数通用的不同方式。

2 个答案:

答案 0 :(得分:9)

你可以使用GenericZero原语,但是你需要使你的函数内联并使它明确地成为一个函数(现在你的函数是用point-free style编写的)因为原则上不能内联值。

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

请注意,通过删除Type参数'T,编译器会自动推断静态成员约束:

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

答案 1 :(得分:1)

 LanguagePrimitives.GenericZero

:)