Могут ли провайдеры типа F# быть включены в C#

Новые замечательные поставщики типов функций F# 3.0 могут использоваться для преодоления несоответствия между типами или классами данных F# и структурами источников данных, такими как XML или WSDL. Однако это несоответствие также является проблемой в других языках.NET, таких как C#.

Я хотел бы использовать провайдеров F# 3.0 в коде C#. Как я могу это сделать, если вообще? Кроме того, если мы не можем, что бы реализация C# могла их использовать?

2 ответа

Я думаю, что @kvb дает хороший обзор некоторых технических трудностей. Я согласен, что вывод типов будет проблематичным - вы будете в основном ограничены использованием созданных провайдером типов локально, аналогично анонимным типам. Я думаю, что C# может прийти с чем-то похожим в Roslyn, но я сомневаюсь, что он будет так же элегантно и плавно интегрирован, как в F# (где поставщики типов на самом деле являются языковой функцией, а не просто инструментом).

Чтобы ответить на два ваших конкретных вопроса:

[Как я могу] использовать провайдеров F# 3.0 в коде C#?

Поставщики типа F# действительно понятны только компилятору F#, поэтому вам нужно использовать их из F#. Для поставщиков генеративных типов (SQL, Entities, WSDL, файлы конфигурации) вы можете ссылаться на поставщика из F# и использовать сгенерированные типы из проектов C#.

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

Что реализация C# должна иметь возможность использовать их?

Я мог бы, конечно, просто сказать "C# должен был бы поддерживать поставщиков типов!", Но вот еще несколько мыслей. Поставщики типов - это просто сборки.NET, и они не используют специфичные для F# типы. ITypeProvider Интерфейс может использоваться любым языком.NET, включая C#, поэтому, если разработчики C# захотят, они могут повторно использовать всех замечательных провайдеров, уже созданных для F#.

Итак, отправьте это предложение голосу пользователя C# или отстаивайте его в другом месте (или убедите команду Mono реализовать это!), И, возможно, оно будет добавлено в C# (vNext + 1 + ...). Пока что вы получите все преимущества только в F#.

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

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

let moviesStartingWith prefix =
    query {
        for movie in MyDataSource.Movies do
        where (movie.Title.StartsWith(prefix) }
    |> Seq.toList

В C# мне нужно указать тип возвращаемого значения (например, List<DataSource.ServiceTypes.Movie>), который в итоге становится рутиной, и это означает, что даже с IntelliSense я разбираю набор предоставленных типов для генерации подписи в дополнение к разбивке на набор предоставленных значений для генерации запроса.

Конечно, это относится и к областям, отличным от поставщиков типов, но я думаю, что с некоторыми из иерархий вложенных типов, которые естественным образом генерируются некоторыми поставщиками, на практике это будет особенно болезненным, поскольку имена типов становятся чрезвычайно длинными.

Другие вопросы по тегам