定义平方和而不定义参数

时间:2014-03-28 05:58:07

标签: f# value-restriction

我想使用参数明确定义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描述我遇到过的问题:价值限制。

2 个答案:

答案 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中搜索“值限制错误”应该提供更多此问题的示例。