Как адаптировать Action <string> в FSharpFunc <string, unit>

2

Попытки передать код 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 из С# в F #?

  • 0
    Мне неясно, что вы пытаетесь сделать? Вы пытаетесь печатать на консоль из F #?
  • 0
    Как очень четко говорится в сообщении об ошибке, функция F # ожидает параметр типа FSharpFunc<_> . Почему вы продолжаете пытаться передать ему Action или Func ?
Показать ещё 2 комментария
Теги:
f#

2 ответа

3
Лучший ответ

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> не имеют отношения к среде выполнения, хотя мы знаем, что они концептуально близки. К сожалению, С# не добавил никакой поддержки, чтобы помочь с совместимостью F #.

  • 1
    Спасибо за предоставленный функциональный и ссылочный пример. Я запоздало начал подозревать, что приспособления, в случае необходимости, будут существовать только в упаковке F #, но обнаружил, что это потребовало бы некоторых усилий с моим текущим инструментарием. Еще раз спасибо.
  • 0
    FYI; Вы также могли бы реализовать абстрактный класс FSharpFunc . Моя первая попытка сделала это, но потом я нашел подходящий вспомогательный метод.
Показать ещё 1 комментарий
3

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню