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

Если у SML.NET были функторы, почему F # не может?

Этот вопрос начался с

SML.NET может выполнять функции и работать с Microsoft.NET.
  * См.: Руководство пользователя SML.NET Раздел 4.8.2 Типы и функторы классов?

Я все время вижу, что F # не может выполнять истинные функции из-за некоторых ограничений в Microsoft.NET.
  * Могут ли ML-функторы полностью кодироваться в .NET(С#/F #)?
  * Любое обходное решение для функтора?

Итак, если SML.NET может выполнять функции на .NET, то почему F # не может? Что делает SML.NET этим F # не может?

Чем больше я узнаю о функторах, исходящих из теории категорий, тем больше я вижу их красоту и желаю иметь их в F #.

ИЗМЕНИТЬ

В стремлении лучше понять взаимосвязь между теорией категорий и функциональным программированием см. эти Q & A в CS: StackExchange.

4b9b3361

Ответ 1

Нет фундаментальных ограничений .NET, которые останавливают функторы от реализации в F #. Правда, они не могут быть представлены непосредственно в метаданных .NET, но не могут быть и другие функции языка F #, такие как типы объединения. Компиляторы для языков с функторами (например, Standard ML, OCaml) имеют пропуск под названием defunctorize; он работает так же, как расширение шаблона С++, поскольку он "выравнивает" функторы, специализируясь на нормальных модулях.

Компилятор F # может сделать то же самое, но вы должны спросить: как это будет отображаться на других языках .NET? Поскольку функторы не могут быть напрямую закодированы в системе типа .NET, вам нужно будет каким-то образом представить их; и если это представление трудно/невозможно использовать из С# или VB.NET, будет ли смысл включать функции F #? Нетривиальная часть успеха F # исходит из его способности легко взаимодействовать (в обоих направлениях) с С# и VB.NET.

РЕДАКТИРОВАТЬ: Не поймите меня неправильно - мне бы хотелось, чтобы в F # были функторы, они были бы очень полезны для обработки нескольких случаев, которые в настоящее время болезненны и/или невозможны для реализации без них. Я просто указываю, что основная причина, по которой язык еще не существует (и, возможно, никогда не будет), заключается в том, что проблема взаимодействия не была решена; проблема с кодированием метаданных на самом деле является легкой частью.

РЕДАКТИРОВАТЬ 2: Код для прохода defunctorize MLton: defunctorize.fun

Обновление: Я подумал о том, как функторы действительно могут быть выражены в системе типа .NET, поэтому я собрал небольшой эксперимент. Это некрасиво, но это работает - так что теперь мы знаем, что, по крайней мере, это возможно, что F # может однажды поддерживать функторы. На практике сложность, которую вы видите в моем экспериментальном коде, будет скрыта компилятором/языком. Если вы хотите проверить это: experimental-functors