Function lambda表达式到Func的转换

Function lambda表达式到Func的转换,function,lambda,f#,func,Function,Lambda,F#,Func,鉴于以下情况: open System.Linq let seqA = { 1..10 } 这项工作: seqA.All (fun n -> n > 0) 但是,这并不是: let abc = fun n -> n > 0 seqA.All (abc) 为什么F#提供从lambda表达式到Funcs的隐式转换,而不提供从函数的隐式转换?欢迎指向文档的指针,在这里我可以阅读这里发生的事情。:-) 本规范的(相当复杂的)章节中介绍了这一点。引用后者的话: 如方法应用

鉴于以下情况:

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
s的隐式转换,而不提供从函数的隐式转换?欢迎指向文档的指针,在这里我可以阅读这里发生的事情。:-)

本规范的(相当复杂的)章节中介绍了这一点。引用后者的话:

如方法应用解决方案(见§14.4)所述,两个 类型定向转换应用于方法调用

第一个类型定向转换转换匿名函数 委托类型的表达式和其他函数值参数。 鉴于:

  • 委托类型D的形式参数
  • 已知类型ty1->…->的实际参数fargtyn->rty
  • 委托类型D的
    Invoke
    方法正好有n个参数
然后:

  • 该参数被解释为已写入:
    new
    D(
    fun
    arg1…argn->farg arg1…argn)
这似乎表明此转换将应用于任何函数值,但观察结果表明它仅适用于匿名函数。

这在规范的(相当复杂的)部分中有介绍,在中也有介绍。引用后者的话:

如方法应用解决方案(见§14.4)所述,两个 类型定向转换应用于方法调用

第一个类型定向转换转换匿名函数 委托类型的表达式和其他函数值参数。 鉴于:

  • 委托类型D的形式参数
  • 已知类型ty1->…->的实际参数fargtyn->rty
  • 委托类型D的
    Invoke
    方法正好有n个参数
然后:

  • 该参数被解释为已写入:
    new
    D(
    fun
    arg1…argn->farg arg1…argn)

这似乎表明此转换将应用于任何函数值,但观察表明它仅适用于匿名函数。

当然。我刚意识到我把最后一部分删掉了。修好了,丹尼尔,检查一下。将F#函数传递给某些方法确实有效。我刚意识到我把最后一部分删掉了。修好了,丹尼尔,检查一下。将F#函数传递给某些方法确实有效。