F# 如何对任何.Net值类型使用Seq.sum?

F# 如何对任何.Net值类型使用Seq.sum?,f#,type-parameter,F#,Type Parameter,我想做一个函数,处理任何数字类型的数据(int,float,double)的seq,通过映射对其进行一些计算,然后对这些计算值进行求和。我遇到的问题是,Seq.sum(或者实际上只是一般的“(+)”)导致类型参数为整数,或者只是给出一个完全错误。似乎应该有一种方法通过使用类型约束来实现这一点,但我似乎无法实现 type ValueWithComputation<'v> = {Value: seq<'v>; Computation: 'v -> 'v} let ca

我想做一个函数,处理任何数字类型的数据(int,float,double)的seq,通过映射对其进行一些计算,然后对这些计算值进行求和。我遇到的问题是,Seq.sum(或者实际上只是一般的“(+)”)导致类型参数为整数,或者只是给出一个完全错误。似乎应该有一种方法通过使用类型约束来实现这一点,但我似乎无法实现

type ValueWithComputation<'v> = {Value: seq<'v>; Computation: 'v -> 'v}

let calculateAndCombine (x: ValueWithComputation<'v>) = 
    x.Value
    |> Seq.map x.Computation
    |> Seq.sum // sometimes gives error: "Could not resolve the ambiguity inherent in the use of operator '(+)'

let x = {Value= {1..10}; Computation= (fun x->x*2)}
let y = {Value= {(1.0)..(10.0)}; Computation= (fun x->x*x)}

let totalX = calculateAndCombine x //this causes the code force 'v to be int
let totalY = calculateAndCombine y //gives an error since this isn't an int
带计算的类型值;计算:'v->'v}

让calculateAndCombine(x:ValueWithComputation我让它这样工作。阅读Foggy Finder链接的答案。然后你还需要静态成员
Zero
,以便
工作

type ValueWithComputation< ^T when ^T: (static member (+): ^T * ^T -> ^T) and ^T: (static member Zero: ^T)> = 
  { Value: seq< ^T>
    Computation: ^T -> ^T }

let inline calculateAndCombine x = 
    x.Value
    |> Seq.map x.Computation
    |> Seq.sum

let x = {Value= {1..10}; Computation= (fun x->x*2)}
let y = {Value= {(1.0)..(10.0)}; Computation= (fun x->x*x)}

let totalX = calculateAndCombine x
let totalY = calculateAndCombine y
在^T:(静态成员(+):^T*^T->^T)和^T:(静态成员零:^T)>=
{值:seq<^T>
计算:^T->^T}
让内联计算组合x=
x、 价值观
|>Seq.map x.计算
|>序号总和
设x={Value={1..10};计算=(funx->x*2)}
设y={Value={(1.0)…(10.0)};计算=(funx->x*x)}
设totalX=calculateAndCombine x
让totalY=计算组合y

Duplicate:这很有道理。我不知道您可以对该类型的成员设置约束。谢谢!