2011-03-10 70 views
4

好一个元组,让我们说我有一个类型的定义,像这样:我该如何对待一个类型,本质上是一个元组在F#

type Foo = 
    | Bar of (SomeType * SomeType * SomeType * SomeType) 
    | ...(other defs) 

所以我有一个酒吧,基本上是一个元组4个SomeTypes。我想访问元组的各个成员。我尝试这样做:

让酒吧(一,二,三,四)= someBar

但是当我尝试指一个或两个后来在功能它说,“价值或构造函数没有定义“因此它不按预期处理任务。什么是正确的方法来做到这一点?

另外,如果我尝试:

let one,two,three,four = someBar 

它抱怨: someBar预计有型'A * B * 'C *' d但这里已经Foo类型

感谢,

回答

6

你只需要添加括号的另一组:

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

斯蒂芬指出,没有额外的的括号编译器将这一行的代码名为Bar新功能的定义。如果受歧视的工会还有其他案例,模式匹配可能会更合适,这也是对的。

+0

啊!当我第一次看到这个时候,在我脑海中添加了一些parens,但我没有遵循这条路! – 2011-03-10 02:32:29

1

鉴于

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 

最后让利绑定解释为一个功能,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 

这是很公平的,因为不像元组分解let绑定,在这里分解Bar是危险的,因为这场比赛是不完整的(x实际上可能其他Foo案例,如Bar2)。

编辑

@kvb知道的秘密让你想到这个工作!

相关问题