我想使用参数明确定义sumOfSquares
,而不依赖于功能组合
这是我的代码
let sumOfSquares = Seq.map (fun n -> n * n) >> Seq.sum
然而,我收到以下错误
stdin(80,5):错误FS0030:值限制。价值' sumOfSquares' 已被推断为具有泛型类型
val sumOfSquares : ('_a -> int) when '_a :> seq<int>
将参数设为&#39; sumOfSquares&#39;明确的,或者,如果你不打算 它是通用的,添加一个类型注释。
解决这个问题的一种方法是使用参数
let sumOfSquares nums = nums |> Seq.map (fun n -> n * n) |> Seq.sum
这将有效。但是,我想看看我是否可以通过单独使用合成来定义平方和
更新
这里有nice article描述我遇到过的问题:价值限制。
答案 0 :(得分:1)
制作类型注释:
let sumOfSquares : seq<int> -> int =
Seq.map (fun n -> n * n) >> Seq.sum
答案 1 :(得分:0)
让我们看看当类型推断试图在这里工作时会发生什么。首先你有
Seq.map (fun n -> n * n) >> Seq.sum
现在Seq
允许实施Seq
的任何内容,我们可以输入int list
int[]
或其他许多内容。
因此,您将此作为类型
val sumOfSquares : ('_a -> int) when '_a :> seq<int>
现在的问题是sumofSquares
是一个值(这是一个函数)。不幸的是,您不能在顶级绑定中使用通用值。如果你明确地使用参数,你可以拥有泛型函数。
因此,类型注释的一种替代方法是使参数显式如此
let sumOfSquares s= s |> Seq.map (fun n -> n * n) |> Seq.sum
这有效
在SO中搜索“值限制错误”应该提供更多此问题的示例。