【问题标题】:Invoking C# delegate from F# - Is there a cleaner syntax?从 F# 调用 C# 委托 - 是否有更简洁的语法?
【发布时间】:2015-02-04 10:24:41
【问题描述】:

在 C# 中,如果委托定义如下:

delegate void A();
A a = () => {Console.WriteLine("Test")};

可以通过以下方式调用:

a.Invoke(); // Works
a();        // Also works

在 F# 中,可以调用 C# 委托:

a.Invoke() // Works fine.
a()        // Error: This value is not a function and cannot be applied

为什么我不能在 F# 中使用第二种方法?在 C# 中, () 运算符是简单地映射到 Invoke 方法,还是在下面发生了其他事情。 F# 中有更简洁的语法吗?

【问题讨论】:

    标签: f# delegates syntactic-sugar


    【解决方案1】:

    我认为你无能为力。 F# 和 C# 使用不同的类型来表示可以调用的事物。在 C# 中,自然使用委托(如 Func<T1, T2>),而在 F# 中,自然使用 F# 函数值(T1 -> T2)。从 F# 调用委托更丑,就像从 C# 调用 F# 函数一样丑。

    最好的办法是大部分时间使用原生表示,并在边界处将委托转换为函数(反之亦然)。

    所以,在编写 F# 代码时,我只会使用函数:

    let foo f = f(10) + f(32)
    

    但是在将它暴露给 C# 时,我会编写一个操作,接受委托并将其转换为函数,然后再调用 foo

    type CSharpFriendly() =
      static member Foo(f:Func<int, int>) = foo f.Invoke
    

    这也利用了这样一个事实,即只写 f.Invoke 会返回一个不错的 F# 函数值。

    【讨论】:

      猜你喜欢
      • 2014-10-29
      • 2012-08-01
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      相关资源
      最近更新 更多