Есть ли способ использовать регистр типа суммы в качестве параметра типа другого типа? - PullRequest
1 голос
/ 04 мая 2020

Есть ли способ, которым я могу сделать следующее:

type First = |A |B

type Second = |C of First |D of A

В приведенном выше случае я хочу указать D так, чтобы он мог содержать только First типа A вместо любой First. Можно ли как-то навязать это ограничение в объявлении?

Ответы [ 2 ]

2 голосов
/ 04 мая 2020

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

Предположим, что случай A содержал некоторые данные (A of int list list). Вы можете использовать псевдоним типа, чтобы дать короткое или значимое имя для int list list. И затем вы можете повторно использовать имя типа в другом месте:

type A = int list list

type First =
    | A of A
    | B

type Second =
    | C of First
    | D of A

Теперь вы также можете написать функцию, которая принимает значение типа A.

Это довольно распространенная практика для создания случай, который имеет то же имя, что и тип, который он содержит (например, A of A). Просто проясните разницу между регистром A и типом A.

1 голос
/ 04 мая 2020

Вы можете получить что-то близкое с одним дополнительным шагом. Вам понадобится общий тип, общий для A в First и D в Second:

type MyA =
| A

type First =
| A of MyA
| B

type Second =
| C of First
| D of MyA

Таким образом, вы можете сделать First.A и Second.D одного типа .

...