Как назначить многопараметрическую функцию F # для переменной C #? - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть следующая функция F #:

let myFSharpFunction : IO.TryTransform<IDatabaseService,EditForm,SyncType,ErrorDescription> =
    fun _ _ -> Ok someValue

Я хотел бы использовать эту функцию F # в качестве значения / делегата в моем коде C #:

FSharpFunc<IDatabaseService, FSharpFunc<EditForm, FSharpResult<SyncType, ErrorDescription>>> referenceToFSharpFunction  = myFSharpFunction;

Однако я получаюошибка:

Ошибка CS0428 Невозможно преобразовать группу методов 'myFSharpFunction' в тип без делегатов 'FSharpFunc >>'.Вы намеревались вызвать метод?

Затем я попытался:

public delegate FSharpResult<SyncType, ErrorDescription> myDelegate(IDatabaseService database, EditForm editForm);
...
myDelegate someDelegate = myFSharpFunction;
FSharpFunc<IDatabaseService, FSharpFunc<EditForm, FSharpResult<SyncType, ErrorDescription>>> FSharpFuncToInvoke = someDelegate;

Однако эта попытка также дала мне ошибку:

type'Sevan.Android.FormsSyncFragment.myDelegate' в 'Microsoft.FSharp.Core.FSharpFunc >>'

Обновление:

Попытка 1:

Затем я попытался добавить следующую функцию в модуль F #:

let toFunc2 f = Func<_, _, _> f // f : 'a -> 'b -> 'c

Затем я обновил код C # до следующего:

var referenceToFSharpFunction = toFunc2<IDatabaseService, EditForm, FSharpResult<SyncType, ErrorDescription>>(myFSharpFunction);

Но затем я получил эту ошибку:

Невозможно преобразовать группу методов 'FSharpFuncToInvoke' в тип без делегатов 'FSharpFunc >>'.Вы намеревались вызвать метод?

Попытка 2:

Я также попытался установить код F # следующим образом:

let toFunc2 f = Func<IDatabaseService,EditForm, Result<SyncType,ErrorDescription>> f // f : 'a -> 'b -> 'c

Затем в моем C # я попытался сделать следующее:

var referenceToFSharpFunction = toFunc2<IDatabaseService, EditForm, FSharpResult<SyncType, ErrorDescription>>(myFSharpFunctione);

Но эта попытка дала мне такую ​​ошибку:

Ошибка CS0308 Неуниверсальный метод'Mock.toFunc2 (FSharpFunc >>)' нельзя использовать с аргументами типа

В заключение, как мне назначить многопараметрическую функцию F # для переменной C #?

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Если вы определяете некоторую функциональность F #, которая должна использоваться клиентом C #, тогда я настоятельно рекомендую выставить все функциональные возможности в C # -дружественном способе - это означает, что все переносы на стороне F # выполняются так, чтобыПотребителю C # вообще не нужно беспокоиться о таких вещах, как FSharpFunc.

Трудно сказать, как это должно работать в вашем случае - потому что ваш пример на самом деле не показывает какой-либо реалистичный фрагмент кода - толькокакой-то адаптер с довольно сложным интерфейсом - но вы могли бы сделать что-то вроде следующего:

// Your F# function that is used elsewhere in F# code
let myFsharpFunction = 
  fun _ _ -> Ok someValue

// Your F# logic, exposed as a C#-friendly `System.Func` delegate
let myCsharpFunction = 
  System.Func<_, _, _>(myFsharpFunction)
0 голосов
/ 16 февраля 2019

Тип функции F # FSharpFunc - это нечто совершенно отдельное от Func / Action, используемого в C #, поэтому вам необходимо «преобразовать» его, создав соответствующий тип, который понимает C #, что легко, но необходимодолжно быть сделано для каждого количества аргументов индивидуально.

let toFunc1 f = Func<_, _> f // f : 'a -> 'b
let toFunc2 f = Func<_, _, _> f // f : 'a -> 'b -> 'c
// etc.

let toAction0 f = Action f // f : unit -> unit
let toAction1 f = Action<_> f // f : 'a -> unit
// etc.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...