Компилятор достаточно достаточно умен, чтобы знать, что существует только одна возможность, но все же он должен различать упакованные и развернутые значения, поскольку, по крайней мере, это разные типы.
Пользовательские типы отдельных тегов могут быть развернуты или более точно деконструированы везде, где может использоваться шаблон, как при деконструкции записей или кортежей.
Вы можете деконструировать его в выражении case
, так как выи как аргумент функции
myFunction (TheTag arg) = ...
, но также в привязке let
let TheTag arg = myObject in ...
Если вы попытаетесь сделать это с пользовательским типом, имеющим несколько тегов, компиляторскажет вам, что «этот шаблон не охватывает все возможные значения».Но он прекрасно работает, если тип имеет только один тег, поскольку охватывает все возможные значения, а компилятор достаточно , чтобы распознавать это.