Подтвердить что ты не робот

Рекомендации по разработке библиотеки С#, пригодной для использования с F #

Я просто хочу указать, что это вопрос не в обратном направлении

Лучший подход для проектирования библиотек F # для использования как из F #, так и для С#

Здесь я не спрашиваю, как создать функциональную библиотеку, написанную на С#, которая будет использоваться в обоих мирах.

Я хотел бы знать хорошие практики, на что выбор дизайна охватывает или избегать, чтобы получить разумный компромисс, чтобы сделать эту библиотеку пригодной для использования от F # > .

Практика, например (например):

  • сохранить иерархию объектов как можно проще

  • избегать мутирующего состояния объектов, но возвращать новые

  • и т.д...

Любой, кто уже сделал это, может поделиться им опытом?

Боковое примечание

Интересно отметить этот проект OSS, IronJS. Да, это написано в F #, но автор разоблачает два специализированных хоста IronJS.Hosting.FSharp и IronJS.Hosting.CSharp.

4b9b3361

Ответ 1

Представьте, что в один прекрасный день вы захотите переписать свою библиотеку С# в F # для лучшего удобства использования. Вот пути, которые вы, скорее всего, возьмете:

enter image description here

Я фокусируюсь на пути "Императивный С# → Функциональный С# → Функциональный F # → Идиоматический F #". Чем более функциональна ваша библиотека С#, тем более удобна ваша библиотека в F #. Функциональный стиль помогает повысить композитоспособность и ближе к идиоматическому коду F #. Вдоль этих строк вы можете:

  • Объявить неизменяемость по умолчанию. Если вы не знаете, нужно ли обновлять поле/свойство позже, сначала отметьте его readonly.
  • Следуйте стилю, основанному на выражениях и декларативном программировании. Операции LINQ являются хорошими примерами.
  • Используйте неизменяемые коллекции или изменяемые коллекции неизменным способом. С введением неизменяемых коллекций С#, это должно быть проще, чем когда-либо прежде.

Изображение выше взято из F # для удовольствия и прибыли Портирование из серии С# в F #. Они очень полезны; зная, как концепции С# выражаются в F #, улучшат удобство использования вашей библиотеки.

Трудно избежать объектно-ориентированных функций С#. Помните, что вывод типа F # не очень хорошо работает с этими функциями. Вдоль линии поддержания иерархии объектов просто, вы должны уменьшить количество перегрузок элементов. Большое количество перегрузок элементов легко смущает проверку типа F #. Кроме того, не повредить распространение тонкой оболочки F # с вашей библиотекой С#. Некоторые вещи, которые вам нужно сделать, включают некоторые методы в функции модуля и создание Active Patterns для разложения иерархии объектов.

Ответ 2

Взаимодействие с существующими библиотеками .NET было главной целью проекта F #, поэтому нет никаких ограничений на использование библиотек.

Тем не менее, из-за более строгой типизации F # есть несколько шаблонов, которые приводят к немного более clunkier-коду. Шаблон построителя один.

var bldr = new StringBuilder();
bldr.Append("abc"); //ignoring return value

против.

bldr.Append("abc") |> ignore //must be explicitly ignored

Но это легко работать с использованием метода расширения или функции let-bound. Итог: interop - одна из сильных сторон F # и наибольших достижений.