Как адаптировать Action <string>в FSharpFunc <строка, единица измерения> - PullRequest
2 голосов
/ 25 марта 2019

При попытке передать код Action в код F # возникает следующая синтаксическая ошибка в .net 4.6.1, VS2015 ...

Error   CS1503  Argument 1: 
cannot convert from 'System.Action<string>' to 
'Microsoft.FSharp.Core.FSharpFunc<string, Microsoft.FSharp.Core.Unit>'

Попытки заключаются в следующем ...

using Microsoft.FSharp.Core;

....

Action<string> logger = Console.WriteLine;

App.perform(new Action<string>(Console.WriteLine), args);

App.perform(logger, args);

App.perform(new Action<string>(msg => Console.WriteLine(msg)), args);

App.perform((new Action<string>(msg => Console.WriteLine(msg))), args);

App.perform((new Func<string,Unit>(msg => Console.WriteLine(msg))), args);

App.perform(new Func<string,Unit>(Console.WriteLine), args);

Как правильно передать System.Console.WriteLine из C # в F #?

Ответы [ 2 ]

3 голосов
/ 25 марта 2019

Microsoft.FSharp.Core.FuncConvert предоставляет различные функции преобразования / адаптера, один из них может адаптировать Action<string> к FSharpFunc<string, unit>.

// Reference: FSharp.Core.dll
var writeLine = Microsoft.FSharp.Core.FuncConvert.FromAction<string>(Console.WriteLine);
App.perform (writeLine);

Проблема заключается в том, что класс Action<string> делегат и FSharpFunc<string, unit>не имеет отношения к среде выполнения, хотя мы знаем, что они концептуально близки.К сожалению, C # не добавил никакой поддержки, чтобы помочь с совместимостью F #.

3 голосов
/ 25 марта 2019

Вы должны конвертировать Action<T> в F # FSharpFunc<T>.Это необходимо, потому что все функции Lambda в F # используют скрытую функцию FSharpFunc, и они не имеют одинаковую семантику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...