2010-05-03 72 views
0

我想要一個函數列表,但似乎是空手而來。基本的代碼是這樣的:F#函數列表

let doSomething var = 
    var 

let doSomething2 var = 
    var 

let listOfStuff = [doSomething; doSomething2] 

,我收到以下異常:

錯誤2數值限制。值 'listOfStuff'已被推斷爲具有 通用類型val隊列:('_a - > '_a)list將'queue'定義爲 一個簡單的數據項,使其具有明確參數的函數 或if你做 不打算是通用的,添加一個 類型 註釋。 C:\ fsharp \ SentimentFramework \ TradeSignalProcessor \ Program.fs 16 9 TradeSignalProcessor

我嘗試添加了[<GeneralizableValue>]屬性,但沒有奏效...

回答

3

你想要一個由功能組成的列表嗎?我認爲這將是這樣的:

let f x = x + 1 
let g x = x + 1 

let listOfFunc = [f; g] 

如果你需要指定的參數,只記得使用類型符號:

let f (x:string) = x + "1" 
+0

正好。注意這些功能是如何相同的? – Shaun 2010-05-03 13:15:09

+1

OP是否想在列表中使用兩種不同的函數類型? – Tejs 2010-05-03 13:20:26

+0

我添加了類型聲明的功能和一切清理。我必須在某處有一些不明確的地方,謝謝你的幫助 – akaphenom 2010-05-03 13:22:03

0

列表都應該有相同的類型。相反,嘗試使用一個元組。

...並嘗試做錯誤的建議。至少給你的輸入一個類型。

2

正如其他人所指出的,給予明確的類型的功能或到您的列表將解決您的問題。發生這種情況的原因是函數可能具有泛型類型,但是(通常來說)值不能。編譯器已經推斷,對於任何類型'a,您的兩個函數都有'a -> 'a類型。這意味着您的列表將具有類型('a -> 'a) list,這是一種通用類型,對於某個值無效。指定顯式類型(如let listOfStuff : (int -> int) list = ...)將解決不明確性。

話雖如此,請注意,我無法在最新版本的編譯器(F#2.0.0.0)中重現此確切問題。看來,列表表達式可以被推廣(可能是因爲它們是無副作用的)。但是,當我使用數組表達式時,我看到類似的錯誤。