鉴于以下内容:
open System.Linq
let seqA = { 1..10 }
这有效:
seqA.All (fun n -> n > 0)
然而,这不是:
let abc = fun n -> n > 0
seqA.All (abc)
为什么F#提供从lambda表达式到Func
的隐式转换,而不是函数?我可以阅读文档的指示,我可以在这里阅读这里发生的事情。 : - )
答案 0 :(得分:4)
Method Resolution上的规范的(相关参与的)部分以及Type-directed Conversions at Member Invocations中的内容再次介绍了这一点。引用后者:
如 Method Application Resolution (见§14.4)中所述,两个 在方法调用中应用了类型定向的转换。
第一个类型导向转换转换匿名函数 委托类型的表达式和其他函数值参数。 给出:
- 委托类型的正式参数 D
- 已知类型的实际参数 farg ty 1 - > ... - > ty n - > RTY
- 委托类型 D 的<{1}}方法的 n 参数
然后:
- 该参数被解释为如果写入:
Invoke
D (new
arg 1 ... arg n - &gt; farg arg 1 ... arg n )
似乎暗示此转换将应用于任何函数值,但观察表明它仅适用于匿名函数。