Использование типов данных F # в C # - PullRequest
2 голосов
/ 23 ноября 2011

В частности, я действительно хочу неизменный / общий связанный список, и я думаю, что иметь неизменные карты и наборы тоже было бы неплохо.Пока мне не нужно беспокоиться о реализации ядра, я могу легко добавить методы расширения / подкласс / обернуть его, чтобы обеспечить достаточно гладкий внешний интерфейс для использования в себе.не делаете это?Производительность, несовместимость и т. Д .?

Ответы [ 2 ]

7 голосов
/ 23 ноября 2011

FSharpx включает в себя пару «адаптеров», так что коллекции F # могут более комфортно использоваться в C #. Вот краткий пример:

var a = FSharpList.Create(1, 2, 3);
var b = a.Cons(0);
b.TryFind(x => x > 4)
 .Match(v => Console.WriteLine("I found a value {0}", v),
        () => Console.WriteLine("I didn't find anything"));

Сейчас не так много документации, но вы можете использовать tests для справки. Он не включает в себя абсолютно все операции (я не возражаю против непосредственного использования таких вещей, как MapModule в C #, слишком много), но если вы обнаружите, что вам чего-то не хватает, пожалуйста, раскройте репозиторий и добавьте его!

Я также писал об этом несколько недель назад.

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

5 голосов
/ 23 ноября 2011

Типы в библиотеке F # (такие как Set, Map и list) не предназначены для использования в C #, поэтому я бы не рекомендовал использовать их напрямую.Это можно сделать, и некоторые базовые операции будут работать хорошо (например, добавление элементов в неизменяемую карту и проверка наличия элемента).Однако есть некоторые проблемы:

  • F # также имеет функциональность в модулях (MapModule для неизменяемой карты), и, как пользователь C #, вы ожидаете увидеть их в качестве членов.

  • Функции F # не представлены как Func<_, _> делегаты, но используются специальным F # -специфичным способом.Это означает, что использование функций более высокого порядка будет затруднено.

Итак, в заключение, я думаю, что лучший подход - это поместить тип данных F # в класс (реализован в F #)это предоставляет методы, необходимые для разработчика на C #.Например, вы можете легко объявить метод F #, который принимает делегат Func<_, _> и вызывает функцию F # высшего порядка в модуле.

...