Considering
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
the last let binding is interpreted as a function, Bar : 'a * 'b * 'c * 'd -> Foo . The function name casts you away, as this is the same as your case of union, but it is the same as if you defined let some_func_takes_a_tuple_and_returns_x (y1,y2,y3,y4) = x .
I think you might have to be a little more verbose:
let y1,y2,y3,y4 = match x with | Bar(y1,y2,y3,y4) -> y1,y2,y3,y4
This is true, because unlike decomposition of a tuple, bindings, decomposition of Bar is dangerous here, because the match is incomplete ( x can really be some other Foo case, for example Bar2 ).
Edit
@kvb knows the secret to making this work, as you expect!
source share