Как распределить кортеж записей в частные значения - PullRequest
4 голосов
/ 22 февраля 2012

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

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', который используется в

1 Ответ

5 голосов
/ 22 февраля 2012

Чтобы понять, почему это не работает, декомпилируйте его с помощью 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 уровня модуляесть некоторые проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...