通用函数的通用零

kas*_*rhj 5 f# inline

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

let cumsum<'T> = Seq.scan (+) 0 >> Seq.skip 1 >> Seq.toArray
Run Code Online (Sandbox Code Playgroud)

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

是否有一个通用的零可以替代我的硬编码0,或者可能是一种使函数通用的不同方式.

Gus*_*Gus 9

你可以使用GenericZero原语,但你需要使你的函数内联并使它明确地成为一个函数(现在你的函数是以无点样式编写的),因为原则上不能内联值.

let inline cumsum s = 
  s |> Seq.scan (+) LanguagePrimitives.GenericZero |> Seq.skip 1 |> Seq.toArray
Run Code Online (Sandbox Code Playgroud)

请注意,通过删除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)
Run Code Online (Sandbox Code Playgroud)