Как преобразовать кортеж записей в частные значения

Как использовать привязку let на уровне модуля для привязки двух частных значений к записям в кортеже?

type private T = {F:int}
let private a = {F=1}
let private b, private c = {F=2}, {F=3}

В этом примере a работает нормально, но каждая привязка для b и c завершается с ошибкой:

ошибка FS0410: тип 'T' менее доступен, чем значение, член или тип 'val patternInput : T * T', в которых он используется


person Edward Brey    schedule 21.02.2012    source источник
comment
+1 Похоже на прохудившуюся абстракцию...   -  person ildjarn    schedule 22.02.2012
comment
Вы не создаете кортеж, вы его разрушаете. let private x = {F=2}, {F=3} создает кортеж (и отлично работает). Однако вы наткнулись на интересное поведение.   -  person Daniel    schedule 22.02.2012
comment
@Daniel: Спасибо за разъяснение терминологии. Я обновил заголовок и тело соответственно.   -  person Edward Brey    schedule 24.02.2012


Ответы (1)


Чтобы понять, почему это не работает, декомпилируйте его с помощью Reflector. Вы создаете кортеж и сразу же его разрушаете. В любом случае в режиме отладки промежуточный кортеж создается как поле internal включающего типа (деталь реализации соответствия шаблону). Конечно, это делает его более доступным, чем T, то есть private. Мне любопытно узнать, является ли это ошибкой (похоже).

РЕДАКТИРОВАТЬ

Становится страннее...

Следующее не компилируется (с синтаксической ошибкой), но компилируется нормально, если типы общедоступны и используется let вместо let private.

type private T = {a:int; b:int}
let private t = {a=0; b=0}
let private {a=a; b=b} = t //syntax error

type private U() = class end
let private ul = [U()]
let private [u] = ul //syntax error

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

person Daniel    schedule 21.02.2012
comment
Я отправил отчет об ошибке в Microsoft Connect. Посмотрим, что они скажут. - person Edward Brey; 24.02.2012
comment
@EdwardBrey: я добавил еще несколько причудливых примеров. - person Daniel; 24.02.2012
comment
Microsoft исправила ошибку, так как не исправит. Кажется, это подтверждает, что это действительно ошибка, поэтому я принял ответ Дэниела. Жаль, что они не исправят это, особенно учитывая, что F# такой новый. - person Edward Brey; 25.02.2012
comment
Обходной путь прост, но да, немного странно оставлять его сломанным. Надеюсь, нет, это мгновенный ответ. - person Daniel; 25.02.2012
comment
Легко да, но грязно. :-( Я столкнулся с ошибкой, когда сворачивал строки в электронной таблице в кортеж из двух списков. Мой обходной путь состоял в том, чтобы привязать кортеж к временному значению, а затем создать нужные отдельные значения списка с двумя дополнительными привязками let. - person Edward Brey; 25.02.2012