Как мне реализовать функцию высокого порядка F # в C #? - PullRequest
0 голосов
/ 11 ноября 2018

Как реализовать функцию высокого порядка F # в C #?

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

Ошибка CS0411 Аргументы типа для метода «FuncConvert.ToFSharpFunc (Action)» не может быть выведен из использование. Попробуйте указать аргументы типа явно.

Исходя из ошибки, я не знаю, как явно выразить параметры типа. Следовательно, я не думаю, что C # понимает, что такое единица , которая должна быть возвращена на первой лямбде.

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 голосов
/ 12 ноября 2018

Если вы контролируете как C #, так и F # часть кода, то я не буду пытаться создавать функции F # явно из C # - это просто сделает ваш код 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)

Теперь вы можете использовать DelegateCommand.Create из C # приятным способом:

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

Для записи, я также не совсем вижу значение определения DelegateCommand в F # и использования его из C #, если вы ничего не делаете на стороне F # - это кажется простым типом, который также может быть определено в C # (т.е. вы не получаете много, делая это в F #).

0 голосов
/ 11 ноября 2018

Попробуйте явно указать аргументы типа

public ICommand RequestAccount =
    new DelegateCommand(FuncConvert.ToFSharpFunc<object>(obj => Debug.WriteLine(obj)),
                        FuncConvert.ToFSharpFunc<object, bool>(_ => true));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...