F#: значение «тип X = Y из Z»

Что означает type X = Y of Z в F#? В частности, имеет ли токен Y какую-либо материальную цель? Если я хочу выразить тот факт, что X является типом, поддерживаемым нижележащим типом Z, зачем мне Y в этом выражении?

Согласно https://learn.microsoft.com/en-us/dotnet/fsharp/language-reference/keyword-reference, ключевое слово of используется для выражения одного из них:

  1. Дискриминированные союзы
  2. Делегаты
  3. Типы исключений

Строго говоря, согласно документам, type X = Y of Z не попадает ни в одну из трех вышеперечисленных категорий.

  1. Это не синтаксис Discriminated Union, потому что в нем отсутствует символ вертикальной черты |.
  2. Это не делегат, потому что ключевое слово делегата отсутствует.
  3. Это не тип исключения, потому что тип исключения отсутствует.

Таким образом, похоже, что type X = Y of Z является недопустимым синтаксисом, хотя он повсеместно используется в https://fsharpforfunandprofit.com/posts/conciseness-type-definitions/. Очень озадачивает - неужели документы неточны?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Если вы не хотите, чтобы там был этот дополнительный Y, это также законно:

type X = Z

Это называется "псевдоним типа". Его преимущество перед размеченным объединением заключается в потреблении ресурсов (как производительности, так и памяти), но его недостаток в том, что он не обеспечивает никакой дополнительной безопасности, потому что X оказывается эквивалентным и взаимозаменяемым с Z во всех контекстах.

Просто помните, что если Z не является ранее определенным типом, то type X = Z на самом деле является DU с одним регистром и пустым регистром. Не очень полезно! Но это можно сделать случайно, например. в случае type Duration = TimeSpan если вы забудете open System.

TheQuickBrownFox 13.12.2020 11:43

Это не синтаксис Discriminated Union, потому что в нем отсутствует канал | характер.

Можно опустить первую вертикальную черту в размеченном объединении:

type DU = A of int | B

Это плохой стиль для стандартных многострочных определений, но может подойти для однострочных. В вашем примере есть только один случай, поэтому можно полностью опустить трубу, что, по общему признанию, вызывает путаницу. Включение полосы улучшило бы ясность: type X = | Y of Z

В type X = Y of Z имеет ли токен Y какую-либо материальную цель?

Y используется для устранения неоднозначности между случаями и для сопоставления с данными. Если в будущем, вероятно, будет больше случаев, то имеет смысл иметь эти леса для сопоставления. Если вы знаете, что будет только один случай, то DU — не самый подходящий тип, поскольку запись type X = { Y: Z } — это более простая конструкция, которая достигает той же цели.

Другие вопросы по теме