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