2010-05-03 67 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)中重现此确切问题。看来,列表表达式可以被推广(可能是因为它们是无副作用的)。但是,当我使用数组表达式时,我看到类似的错误。