2014-03-28 53 views
0

平方和我要定義sumOfSquares不使用參數顯式,而不是依賴於功能性成分定義沒有規定參數

這裏的下面

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

但是我的代碼,我得到了以下錯誤

stdin(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 

,這會工作。不過,我想看看我是否可以使用單獨組成

更新

定義平方和這裏有一個nice article描述我遇到的問題:值的限制。

回答

1

做一個類型標註:

let sumOfSquares : seq<int> -> int = 
    Seq.map (fun n -> n * n) >> Seq.sum 
+0

謝謝。糾正我,如果我錯了,F#假設我正在做一個函數接受泛型類型參數,但通過類型推斷,它發現我想定義'seq - > int',因此它變得「困惑」。是這樣嗎? – OnesimusUnbound

+0

@OnesimusUnbound正如你從消息中看到的那樣,F#推斷你想要一個函數接受*從類型層次結構中的'IEnumerable '降序並返回'int'的任何集合。如果你希望參數嚴格爲'seq ',你必須對它進行註釋:)不幸的是,子類型(以及重載)對於類型推斷可能會很棘手。 –

0

所以讓我們看看當類型推斷試圖在這裏工作會發生什麼。首先,你必須

Seq.map (fun n -> n * n) >> Seq.sum 

現在,作爲Seq允許任何實現Seq,我們可以輸入int listint[]或其他許多人。

結果,你會得到這樣的類型

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

現在的問題是,sumofSquares是一個值(這是一個功能)。不幸的是,你不能在頂級綁定中擁有一個通用的值。如果你明確地給出參數,你可以擁有一個泛型函數。

其結果是,一個替代的類型註釋爲使論點明確,像這樣

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

而且這個工程

爲「值限制錯誤」應該給的一些例子,讓搜索這個問題。