Могу ли я использовать динамические типы в F #? - PullRequest
8 голосов
/ 19 августа 2010

.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 голосов
/ 29 июля 2011

Существует модуль FSharp.Interop.Dynamic , в nuget, который реализует динамический оператор с использованием 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 обрабатывает случай автоматического вызова возврата делегата функцией, импровизированный fsharp также позволит вам сделать то же самое с FSharpFunc
  • Добавляет!?Префиксный оператор для обработки вызова непосредственно динамических объектов и функций, тип которых у вас отсутствует во время выполнения.

    Это открытый исходный код, лицензия Apache, вы можете посмотреть на реализацию и она включает в себя модульный тест примеры случаев .

...