F # имеет функцию под названием "Расширение типа" , которая дает разработчику возможность распространять существующие типы. Существует два типа расширений: внутреннее расширение и дополнительное расширение. Первый из них аналогичен частичным типам на С#, а второй - чем-то похожим на расширение метода (но более мощным).
Чтобы использовать внутреннее расширение, мы должны поместить два объявления в один и тот же файл. В этом случае компилятор объединит два определения в один конечный тип (т.е. Это две "части" одного типа).
Проблема в том, что эти два типа имеют разные правила доступа для разных членов и значений:
// SampleType.fs
// "Main" declaration
type SampleType(a: int) =
let f1 = 42
let func() = 42
[<DefaultValue>]
val mutable f2: int
member private x.f3 = 42
static member private f4 = 42
member private this.someMethod() =
// "Main" declaration has access to all values (a, f1 and func())
// as well as to all members (f2, f3, f4)
printf "a: %d, f1: %d, f2: %d, f3: %d, f4: %d, func(): %d"
a f1 this.f2 this.f3 SampleType.f4 (func())
// "Partial" declaration
type SampleType with
member private this.anotherMethod() =
// But "partial" declaration has no access to values (a, f1 and func())
// and following two lines won't compile
//printf "a: %d" a
//printf "f1: %d" f1
//printf "func(): %d" (func())
// But has access to private members (f2, f3 and f4)
printf "f2: %d, f3: %d, f4: %d"
this.f2 this.f3 SampleType.f4
Я прочитал спецификацию F #, но не нашел никаких идей, почему компилятор F # различает значения и объявления участников.
Вопрос в том, является ли это поведение преднамеренным и каким обоснованием оно стоит?