繁体   English   中英

我怎样才能将一个基本上是元组的类型视为F#中的元组

[英]How can I treat a type that is essentially a tuple as a tuple in F#

好吧,所以让我说我有一个类似的定义:

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

所以我有一个Bar,它基本上是4个SomeTypes的元组。 我想访问元组的各个成员。 我试过这个:

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

但是当我尝试在函数中引用一个或两个时,它表示“值或构造函数未定义”因此它不按预期处理赋值。 这样做的正确方法是什么?

另外,如果我尝试:

let one,two,three,four = someBar

它抱怨:someBar预计有'a *'b *'c *'d类型,但这里有类型Foo

谢谢,

您只需要添加另一组括号:

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

正如Stephen指出的那样,如果没有额外的parens,编译器会将这行代码视为名为Bar的新函数的定义。 如果在受歧视的联盟中存在其他案例,他也是正确的,模式匹配可能更合适。

特定

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知道让你按照预期工作的秘诀!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM