0

我想在sumOfSquares没有明确使用参数的情况下进行定义,而是依靠功能组合

下面是我的代码

let sumOfSquares = Seq.map (fun n -> n * n) >> Seq.sum

但是,我收到以下错误

标准输入(80,5):错误 FS0030:值限制。值“sumOfSquares”已被推断为具有泛型类型

val sumOfSquares : ('_a -> int) when '_a :> seq<int> 

要么使“sumOfSquares”的参数显式,或者,如果您不希望它是通用的,请添加类型注释。

解决它的一种方法是使用参数

let sumOfSquares nums = nums |> Seq.map (fun n -> n * n) |> Seq.sum

这将起作用。但是,我想看看我是否可以单独使用组合来定义平方和

更新

这是一篇很好的文章,描述了我遇到的问题:Value Restriction。

4

2 回答 2

1

做一个类型注释:

let sumOfSquares : seq<int> -> int = 
    Seq.map (fun n -> n * n) >> Seq.sum
于 2014-03-28T06:04:50.510 回答
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 中搜索“值限制错误”应该会提供更多有关此问题的示例。

于 2014-03-28T07:29:01.047 回答