【问题标题】:Define a F# function in VB.NET在 VB.NET 中定义 F# 函数
【发布时间】:2014-09-30 02:22:20
【问题描述】:

我在我的 VB 代码中定义了一个 F# 函数,如下所示:

Dim g As Microsoft.FSharp.Core.FSharpFunc(Of Double, Double)

如何将 g 分配给特定函数:例如我想要 g(x) = x^2? 它在 VB.NET 中的语法是什么?

【问题讨论】:

  • 出于好奇,这里的目标是什么?
  • 只需从 FSharpFunc 派生您自己的类,实现 Invoke() 方法。
  • 我的情况是,我在 F# 中编写了一个函数来查找范围内任意函数的一个根。 F# 非常令人印象深刻,我只需要编写 5 行代码(不是开玩笑),而在 VB 中,我必须编写大约 50 行代码。因此,我正在尝试学习如何同时使用这两种语言来发挥它们的优势。 (例如,我想将 VB 用于 UI,F# 用于数学部分)
  • @SLaks,这其实是错误的……F#并没有对所有事情都使用典型的IL函数,但实际上对于高阶函数、函数值等都有自己的内部FSharpFunc。而困难就来了,如果您尝试从其他任何地方调用某些 F# 函数,如果 F# 作者没有特别注意对 IL 友好。正因为如此,F# 函数可以用任何语言编写
  • @NTC 如果你想在一个项目中同时使用 F# 和 VB,我建议你学习如何设计一个对 IL 友好的 F# 程序集,这样你就不会遇到这些问题.例如。您可以在 F# 中定义一个接口,该接口具有计算所需的功能,然后在 VB 中,您可以只实现接口等。诀窍是,避免在面向 VB 中的 DU、函数值等部分。这通常会使您的 VB 代码编写起来更加方便。

标签: vb.net function f# syntax-error


【解决方案1】:

除了 Reed 所说的之外,FSharp.Core 库实际上定义了一个帮助方法,它将委托(您可以使用 lambdas 创建)转换为 F# 函数。

你可以在FuncConvert.ToFSharpFunctionsee MSDN for more info找到它。我建议使用这个函数而不是创建一个自定义类,因为它较少依赖于 F# 编译器如何编译函数的内部细节(你仍然需要了解 FSharpFunc 类型,但不是那么多......)

我对 VB 了解不多,但我想这样的事情可能会奏效:

Dim g = FuncConvert.ToFSharpFunction(Function(x As Double) x * x)

【讨论】:

  • 它工作得很好——谢谢你,这样我就不需要在需要定义函数的时候创建类了。
【解决方案2】:

这是不可能的,至少不使用 lambdas。

FSharpFunc 不是委托 - 它是一个抽象类,这意味着您需要对其进行子类化并实现 Invoke。 F# 会为您执行此操作,但 VB.Net(和 C#)不会。

您可以通过以下方式实现您的目标:

Public Class G
    Inherits FSharpFunc(Of Double, Double)
    Public Overrides Function Invoke(value As Double) As Double
        Return value * value
    End Function
End Class

然后您可以实例化该类并使用它。

Dim g As Microsoft.FSharp.Core.FSharpFunc(Of Double, Double) = New G()

【讨论】:

    猜你喜欢
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多