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

Почему F # поддерживает вложенные классы?

Является ли причина, по которой F # не поддерживает вложенные классы, технические, стилистические, произвольные?

Взгляд на BCL в рефлекторе, вложенные классы используются для счетчиков, DynamicMetaObject s и, возможно, несколько других вещей.

Это вызвало мое любопытство относительно F #, не имеющего этой функции. Я знаю, что есть другие способы сделать то же самое. Мне в основном любопытно.

4b9b3361

Ответ 1

Я полагаю, что вложенные классы не были основной особенностью объектной модели .NET, и она просто была удалена, чтобы сохранить ресурсы. Могут быть некоторые технические трудности (то есть с видимостью или с рекурсивными определениями типов), но я не думаю, что это была бы серьезная проблема.

Во многих случаях, когда можно использовать вложенные классы в С#, например, итераторы, вы можете красиво использовать выражения объектов, поэтому я предполагаю, что они в какой-то мере заменяют вложенные классы:

type Collection() =
  member x.GetEnumerator() = 
    let n = ref 0
    { new IEnumerator with
        member x.Current = box n.Value
        member x.MoveNext() = incr n; true
        member x.Reset() = n := 0 }

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

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

Ответ 2

F # во многом базируется на Caml, у которого нет вложенных классов.

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