如何引用封装在单个案例区分联合中的元组的第一个元素

时间:2015-12-19 19:56:22

标签: f#

假设你有这样的类型:

audioPlayer.currentTime = 0
audioPlayer.play()

然后是一些变量:

type Corner = Corner of int*int

是否可以获取元组的第一个元素的值,如:

let corner = Corner (1,1)

看起来有必要对fst corner 进行某种展开。

2 个答案:

答案 0 :(得分:6)

@Foole提供的答案很好,但是从评论中我得到的印象是你不喜欢“声明”临时变量first。如果你想要做的就是拉出第一个值然后将它传递给另一个函数,这确实会让人觉得麻烦。

我所知道的没有内置设施可让您自动执行此操作。考虑上面给出的Corner类型是判别联盟(DU)的退化情况。通常情况下,DU有更多的情况,并且它们的形状通常是异质的。

有一个单一案例DU可以有充分的理由,例如Corner,但是通常也提供各种“帮助”功能以使这种类型的工作更顺畅。

对于Corner类型,您可以定义以下函数:

let cornerX (Corner(x, _)) = x

let cornerY (Corner(_, y)) = y

在这里,我假设Corner为坐标建模,但如果您愿意,还可以将函数命名为fstsnd。如果您愿意,也可以将它们放在专用模块中。

这将使您能够从Corner值中提取和管道值,而无需临时变量的麻烦:

> corner |> cornerX |> ((*) 10) |> string;;
val it : string = "10"

其中corner定义为OP。

答案 1 :(得分:5)

我认为这意味着

type Corner = Corner of int*int

在这种情况下,这将获得第一个值:

let (Corner(first,_)) = corner