Есть ли менее подробный способ развернуть тип только с одним тегом? - PullRequest
0 голосов
/ 04 марта 2019

Есть ли менее подробный способ развернуть тип только одним тегом, например, в настоящее время я делаю case myObject of TheTag arg -> foo, но я думаю, что компилятор должен быть достаточно умен, чтобы знать, что есть только одна возможность, верно?

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

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

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

Вы можете деконструировать его в выражении case, так как выи как аргумент функции

myFunction (TheTag arg) = ...

, но также в привязке let

let TheTag arg = myObject in ...

Если вы попытаетесь сделать это с пользовательским типом, имеющим несколько тегов, компиляторскажет вам, что «этот шаблон не охватывает все возможные значения».Но он прекрасно работает, если тип имеет только один тег, поскольку охватывает все возможные значения, а компилятор достаточно , чтобы распознавать это.

0 голосов
/ 04 марта 2019

Нет встроенного ярлыка компилятора, который устранял бы необходимость «разворачивать» полезную нагрузку из типа с одним конструктором.Вы всегда можете определить функцию-получатель для этой цели, чтобы избежать операторов case:

getTagArg (TheTag arg) = arg

И затем, когда вам нужно будет использовать ее в коде, вы просто вызовете getTagArg myObject вместо оператора case.

...