F#功能列表

时间:2010-05-03 13:08:51

标签: list f#

我正在尝试列出一系列功能,但似乎空手而归。基本代码是这样的:

let doSomething var  =
    var

let doSomething2 var  =
    var

let listOfStuff = [doSomething; doSomething2]

我得到以下例外:

  

错误2限制值。价值   推断'listOfStuff'有   泛型类型val队列:('_ a - >   '_a)list将'queue'定义为   一个简单的数据术语,使其成为一个功能   有明确的论据,或者,如果你这样做   不打算将它作为通用的,添加一个   类型   注解。 C:\ fsharp \ SentimentFramework \ TradeSignalProcessor \ Program.fs 16 9 TradeSignalProcessor

我尝试添加[<GeneralizableValue>]属性,但这不起作用......

4 个答案:

答案 0 :(得分:3)

你想要一个由功能组成的列表吗?我认为它会是这样的:

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

let listOfFunc = [f; g]

如果您需要指定参数,请记住使用类型表示法:

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

答案 1 :(得分:2)

正如其他人所说,为您的功能或列表提供明确的类型将解决您的问题。发生这种情况的原因是函数可以具有泛型类型,但(一般而言)值不能。编译器推断出,对于任何类型'a -> 'a,您的两个函数都具有类型'a。这意味着您的列表将具有类型('a -> 'a) list,这是一种泛型类型,对于值无效。指定显式类型(例如let listOfStuff : (int -> int) list = ...)将解决歧义。

话虽如此,请注意我无法在最新版本的编译器(F#2.0.0.0)中重现这个问题。看起来列表表达式可以被推广(大概是因为它们没有副作用)。但是,当我使用数组表达式时,我发现了一个类似的错误。

答案 2 :(得分:1)

你已经遇到了'价值限制'。您不能像listOfStuff - 数组那样定义泛型'值'。

有关此主题的a few previous questions您可能会觉得有用,Microsoft在"Automatic Generalization"主题下撰写了这篇文章。

修改:Dmitry Lomov在此撰写了一篇关于此主题的精彩文章:"Finer Points of F# Value Restriction"

答案 3 :(得分:0)

列表应该都具有相同的类型。尝试使用元组代替。

...并尝试按错误提示做。至少为您的输入提供一种类型。