我能否在F#中使用动态类型?

9

.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个回答

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实现了调用站点的缓存,并且是一个PCL库。
  • 处理返回void的方法。如果绑定器没有设置,则会出现绑定异常。
  • dlr自动处理调用由函数返回的委托,Impromptu FSharp也允许您使用FSharpFunc做同样的事情。
  • 添加了!?前缀操作符,以便在运行时直接处理动态对象和函数,而无需了解其类型。

    这是开源的,采用Apache许可证,您可以查看实现并包括单元测试示例用例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接