Общий параметр в Союзе - PullRequest
       10

Общий параметр в Союзе

0 голосов
/ 05 декабря 2018

Привет, FSharpers (или любой другой MLer)

Все еще пытаюсь улучшить свои навыки моделирования предметной области (из ООП).Допустим, у меня есть следующее

type A =
| AA of AA
| AB of AB

type AA = 
{ Code : 'a
  Time : 'b }

type AB =
{ Code : 'a
  Whatsoever : 'c }

Давайте теперь представим, что мне нужна следующая сигнатура функции: (A -> 'a)

Насколько я понимаю, решение, которое у меня есть,чтобы сделать:

let f (a1:A) =
    match a1 with
    | AA a -> a.Code
    | AB a -> a.Code

неудобство этого решения состоит в том, что от меня требуется всегда добавлять новые случаи в мой матч, если я добавляю некоторые в объединение А.

Я представляю другоерешение будет решением типа кортежа (но без «именования» поля):

type A =
| AA of AA * 'a
| AB of AB * 'a

type AA = 
{ Time : 'b }

type AB =
{ Whatsoever : 'c }

let f (a1:A) =
    snd a1

Есть ли какое-то простое решение, которое я пропустил?Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Это:

let f (a1:A) =  snd a1

не будет работать, потому что, чтобы добраться до кортежа, вам сначала нужно сопоставить AA и AB.

Это может работать:

type A0<'b, 'c> =
| AA of AA<'b>
| AB of AB<'c>

type A<'a, 'b, 'c> = A0<'b, 'c> * 'a

let f (a1:A<_,_,_>) =
    snd a1

Ваше решение с Tmp<_> эквивалентно использованию кортежа.

Кстати, в F # важен порядок элементов, для доступа к типу AA его необходимо объявить перед типом A.Ваш первый пример должен выглядеть примерно так:

type AA<'a, 'b> = {
  Code : 'a
  Time : 'b }

type AB<'a, 'c> = {
  Code : 'a
  Whatsoever : 'c }

type A<'a, 'b, 'c> =
| AA of AA<'a, 'b>
| AB of AB<'a, 'c>

let f (a1:A<_,_,_>) =
    match a1 with
    | AA a -> a.Code

Также для использования общих параметров, таких как 'a или 'b, их необходимо объявить в верхней части:

type A<'a, 'b, 'c> = ...
0 голосов
/ 05 декабря 2018

У меня может быть идея, используя общий тип, такой как:

type A =
| AA of Tmp<AA>
| AB of Tmp<AB>

type Tmp<'T> =
{ Code : 'a
  Other : 'T }

type AA = 
{ Time : 'b }

type AB =
{ Whatsoever : 'c }
...