如何在C#中实现F#高阶函数?

时间:2018-11-11 13:13:14

标签: f#

如何在C#中实现F#高阶函数

public ICommand RequestAccount = 
    new DelegateCommand(FuncConvert.ToFSharpFunc( _ => Debug.WriteLine() ), 
                        FuncConvert.ToFSharpFunc( _ => return true       )
                       );
  

错误CS0411方法的类型参数   'FuncConvert.ToFSharpFunc(Action)'不能从   用法。尝试显式指定类型参数。

基于该错误,我不知道如何显式表达类型参数。因此,我不认为C#会理解要在第一个lambda上返回的 unit 是什么。

DelegateCommand

type DelegateCommand (action:(obj -> unit), canExecute:(obj -> bool)) =
    let event = new DelegateEvent<EventHandler>()
    interface ICommand with
        [<CLIEvent>]
        member this.CanExecuteChanged = event.Publish
        member this.CanExecute arg = canExecute(arg)
        member this.Execute arg = action(arg

2 个答案:

答案 0 :(得分:2)

如果您同时控制代码的C#和F#部分,那么我不会尝试从C#显式创建F#函数-这只会使您的C#代码难看。您可以轻松地添加一个静态方法,该方法将使用FuncAction的委托并提供一个C#友好的接口:

type DelegateCommand (action:(obj -> unit), canExecute:(obj -> bool)) =
    let event = new DelegateEvent<EventHandler>()
    interface ICommand with
        [<CLIEvent>]
        member this.CanExecuteChanged = event.Publish
        member this.CanExecute arg = canExecute(arg)
        member this.Execute arg = action(arg)
    static member Create(action:Action<obj>, canExecute:Func<obj, bool>) = 
        DelegateCommand(action.Invoke, canExecute.Invoke)

现在,您可以通过一种不错的方式在C#中使用DelegateCommand.Create

DelegateCommand.Create(
    (o => Console.WriteLine(o)),
    (o => true) )

为了记录,如果您在F#方面没有做任何其他事情,那么我也不太明白在F#中定义DelegateCommand并从C#使用它的价值-看起来像一个简单的类型可以在C#中定义好(也就是说,在F#中这样做并没有带来什么好处)。

答案 1 :(得分:1)

尝试明确指定参数类型

public ICommand RequestAccount =
    new DelegateCommand(FuncConvert.ToFSharpFunc<object>(obj => Debug.WriteLine(obj)),
                        FuncConvert.ToFSharpFunc<object, bool>(_ => true));