【问题标题】:Conversion of lambda expressions to Func将 lambda 表达式转换为 Func
【发布时间】:2014-04-23 03:07:09
【问题描述】:

鉴于以下情况:

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

【问题讨论】:

    标签: function lambda f# func


    【解决方案1】:

    这在 Method ResolutionType-directed Conversions at Member Invocations 的规范的(相当涉及的)部分中进行了介绍。引用后者:

    方法应用解析(参见 §14.4)中所述,两个 类型导向的转换应用于方法调用。

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

    • 委托类型的形式参数D
    • 已知类型 ty1 -> ... -> tyn -> rty 的实际参数 farg时间>
    • 正是 n 个参数到委托类型的Invoke 方法D

    然后:

    • 参数被解释为好像它是这样写的:
      new D(fun arg1 ... arg n -> farg arg1 ... argn)

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

    【讨论】:

    • 当然。我才意识到我遗漏了最后一部分。它已修复。
    • 丹尼尔,检查this out。将 F# 函数传递给 一些 方法确实有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多