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

时间:2010-08-19 11:55:22

标签: dynamic f# c#-4.0 ironpython

.net4.0

mytest.py

def Add (a, b):
    return a+b

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

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

        Console.WriteLine(script.Add(1, 3));

但是,如何在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)

1 个答案:

答案 0 :(得分: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)

与许多片段相比,它有几个优势。

  • 使用Dynamitey进行dlr调用的性能,Dynamitey实现了对callite的缓存,是一个PCL库
  • 处理返回void的方法,如果在设置活页夹时没有丢弃结果,则会出现绑定异常。
  • dlr处理自动调用委托返回的情况,即兴fsharp也允许你用FSharpFunc做同样的事情
  • 添加!?前缀运算符,用于处理直接调用动态对象和在运行时没有类型的函数。

    这是开源的Apache许可证,您可以查看implementation,其中包含单元测试example cases