С учетом
type Foo =
| Bar of (int * int * int * int)
| Bar2 of string
let x = Bar(1,2,3,4)
let Bar(y1,y2,y3,y4) = x
последняя привязка let интерпретируется как функция, Bar : 'a * 'b * 'c * 'd -> Foo
. Имя функции сбивает вас с толку, так как оно совпадает с регистром объединения, но так же, как если бы вы определили let some_func_takes_a_tuple_and_returns_x (y1,y2,y3,y4) = x
.
Я думаю, вам, возможно, придется быть немного более многословным:
let y1,y2,y3,y4 =
match x with
| Bar(y1,y2,y3,y4) -> y1,y2,y3,y4
Что достаточно справедливо, поскольку в отличие от декомпозиции кортежей, позволяющей привязывать, декомпозиция Bar
здесь опасна, поскольку совпадение неполное (x
на самом деле может быть другим * Foo
случаем, таким как Bar2
).
Редактировать
@ kvb знает секрет, как сделать эту работу, как вы ожидаете!