我可以在F#中使用动态类型吗?

Beg*_*udy 8 f# ironpython dynamic c#-4.0

.net4.0

mytest.py

def Add (a, b):
    return a+b
Run Code Online (Sandbox Code Playgroud)

我可以在C#4中使用它,像这样:

        ScriptRuntime runtime = Python.CreateRuntime();
        dynamic script = runtime.UseFile("mytest.py");

        Console.WriteLine(script.Add(1, 3));
Run Code Online (Sandbox Code Playgroud)

但是,我如何在F#中使用动态?

open System
open Microsoft.Scripting.Hosting
open IronPython.Hosting

let call a b=
    let runtime = Python.CreateRuntime()
    let script = runtime.UseFile("mytest.py")
    script.Add(a,b)
Run Code Online (Sandbox Code Playgroud)

jbt*_*ule 3

nuget 上有一个模块FSharp.Interop.Dynamic,它使用 dlr 实现动态运算符。以便:

open System
open Microsoft.Scripting.Hosting
open IronPython.Hosting
open EkonBenefits.FSharp.Dynamic

let call a b=
    let runtime = Python.CreateRuntime()
    let script = runtime.UseFile("mytest.py")
    script?Add(a,b)
Run Code Online (Sandbox Code Playgroud)

与许多现有的片段相比,它有几个优点。

  • 性能 它使用Dynamitey进行dlr 调用,Dynamitey 实现调用点的缓存,并且是一个 PCL 库
  • 处理返回 void 的方法,如果在设置活页夹时没有丢弃这些结果,则会出现绑定异常。
  • dlr 自动处理由函数调用委托返回的情况,即兴 fsharp 也将允许您对 FSharpFunc 执行相同的操作
  • 添加一个!?前缀运算符来处理直接调用运行时没有类型的动态对象和函数。

    它是开源的,Apache 许可证,您可以查看实现它包括单元测试示例案例