[英]Calling C# functions from F#
我试图从 f# 调用这个 function
function 签名为:
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# 中更简洁地写吗?
F# 自动将使用fun... ->...
语法创建的 lambda 函数转换为 .NET 委托类型,例如Action
。 这意味着您可以像这样直接使用 lambda function 作为SetConfigurationSettingPublisher
的参数:
CloudStorageAccount.SetConfigurationSettingPublisher(fun configName setter ->
let configValue = RoleEnvironment.GetConfigurationSettingValue(configName)
setter.Invoke(configName) |> ignore)
多个 arguments 的 function 可以转换为多个 arguments 的委托(ZDBC11CAA5BDA99F77E6FB4DABD882) setter
的类型仍然是Func<...>
而不是简单的 F# function,因此您需要使用Invoke
方法调用它(但这应该没什么大不了的)。
如果您想将setter
从Func<string, bool>
转换为 F# function string -> bool
,您可以定义一个简单的活动模式:
let (|Func2|) (f:Func<_, _>) a = f.Invoke(a)
...然后你可以写:
TestLib.A.SetConfigurationSettingPublisher(fun configName (Func2 setter) ->
let configValue = "aa"
setter(configName) |> ignore)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.