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)