如何在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
答案 0 :(得分:2)
如果您同时控制代码的C#和F#部分,那么我不会尝试从C#显式创建F#函数-这只会使您的C#代码难看。您可以轻松地添加一个静态方法,该方法将使用Func
和Action
的委托并提供一个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));