Это:
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> = ...