我正在尝试列出一系列功能,但似乎空手而归。基本代码是这样的:
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>]
属性,但这不起作用......
答案 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)
列表应该都具有相同的类型。尝试使用元组代替。
...并尝试按错误提示做。至少为您的输入提供一种类型。