Ответ 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