Syntax 如何将本质上是元组的类型视为F中的元组#

Syntax 如何将本质上是元组的类型视为F中的元组#,syntax,f#,types,tuples,Syntax,F#,Types,Tuples,好的,假设我有一个定义如下的类型: type Foo = | Bar of (SomeType * SomeType * SomeType * SomeType) | ...(other defs) 所以我有一个条,基本上是一个四种类型的元组。我想访问元组的各个成员。我试过这个: 让Bar(一,二,三,四)=someBar 但是,当我稍后在函数中尝试引用一个或两个时,它会说“值或构造函数未定义”,因此它没有按预期处理赋值。正确的方法是什么 此外,如果我尝试: let one,

好的,假设我有一个定义如下的类型:

type Foo = 
    | Bar of (SomeType * SomeType * SomeType * SomeType)
    | ...(other defs)
所以我有一个条,基本上是一个四种类型的元组。我想访问元组的各个成员。我试过这个:

让Bar(一,二,三,四)=someBar

但是,当我稍后在函数中尝试引用一个或两个时,它会说“值或构造函数未定义”,因此它没有按预期处理赋值。正确的方法是什么

此外,如果我尝试:

let one,two,three,four = someBar
它抱怨说: someBar应该有'a*'b*'c*'d类型,但这里有Foo类型

谢谢,

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
。函数名让您感到厌烦,因为它与您的并集大小写相同,但它与您定义的
让一些函数取一个元组,然后返回x(y1,y2,y3,y4)=x
是一样的

我想你可能需要更详细一点:

let y1,y2,y3,y4 =
    match x with
    | Bar(y1,y2,y3,y4) -> y1,y2,y3,y4
这很公平,因为与元组分解let绑定不同,这里分解
Bar
是危险的,因为匹配不完整(
x
实际上可能是其他
Foo
情况,如
Bar2

编辑


@kvb知道让这项工作如您所期望的那样成功的秘诀

您只需添加另一组括号:

let (Bar(one,two,three,four)) = someBar

正如Stephen指出的,如果没有额外的参数,编译器会将这行代码视为名为
Bar
的新函数的定义。他还说得对,如果受歧视的联盟中还有其他情况,模式匹配可能更合适。

ah!当我第一次看到这一点时,我的脑海中闪现着添加parens,但我并没有遵循这条道路!