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

Могут ли поставщики типов F # быть включенными в С#

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Что могла бы использовать реализация С#?

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

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

Ответ 2

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

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

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

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

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