Вызов функций C # из F # - PullRequest
       1

Вызов функций C # из F #

4 голосов
/ 29 июня 2011

Я пытался вызвать эту функцию из f #

http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.cloudstorageaccount.setconfigurationsettingpublisher.aspx

Сигнатура функции:

CloudStorageAccount.SetConfigurationSettingPublisher
      (Action<string, Func<string, bool>>) : unit

Вызов C # происходит примерно так:

CloudStorageAccount.SetConfigurationSettingPublisher((configName,
                                                  configSettingPublisher) =>
{
    string configValue = "something"
    configSettingPublisher(configValue);
});

тогда как в F # мне пришлось сделать что-то вроде этого:

let myPublisher configName (setter:Func<string, bool>) =
    let configValue = RoleEnvironment.GetConfigurationSettingValue(configName)
    setter.Invoke(configName) |> ignore

let act = new Action<string, Func<string, bool>>(myPublisher)

CloudStorageAccount.SetConfigurationSettingPublisher(act)

Можно ли написать это более кратко в f #?

1 Ответ

13 голосов
/ 29 июня 2011

F # автоматически преобразует лямбда-функции, созданные с использованием синтаксиса fun ... -> ..., в типы делегатов .NET, такие как Action. Это означает, что вы можете использовать лямбда-функцию в качестве аргумента для SetConfigurationSettingPublisher прямо так:

CloudStorageAccount.SetConfigurationSettingPublisher(fun configName setter ->
    let configValue = RoleEnvironment.GetConfigurationSettingValue(configName)
    setter.Invoke(configName) |> ignore)

Функция нескольких аргументов может быть преобразована в делегат с несколькими аргументами (аргументы не должны рассматриваться как кортеж). Тип setter по-прежнему Func<...>, а не простая функция F #, поэтому вам нужно вызывать его, используя метод Invoke (но это не должно быть проблемой).

Если вы хотите превратить setter из Func<string, bool> в функцию F # string -> bool, вы можете определить простой активный шаблон:

let (|Func2|) (f:Func<_, _>) a = f.Invoke(a)

... и тогда вы можете написать:

TestLib.A.SetConfigurationSettingPublisher(fun configName (Func2 setter) ->
    let configValue = "aa"
    setter(configName) |> ignore)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...