假设你有这样的类型:
audioPlayer.currentTime = 0
audioPlayer.play()
然后是一些变量:
type Corner = Corner of int*int
是否可以获取元组的第一个元素的值,如:
let corner = Corner (1,1)
看起来有必要对fst corner
进行某种展开。
答案 0 :(得分:6)
@Foole提供的答案很好,但是从评论中我得到的印象是你不喜欢“声明”临时变量first
。如果你想要做的就是拉出第一个值然后将它传递给另一个函数,这确实会让人觉得麻烦。
我所知道的没有内置设施可让您自动执行此操作。考虑上面给出的Corner
类型是判别联盟(DU)的退化情况。通常情况下,DU有更多的情况,并且它们的形状通常是异质的。
有一个单一案例DU可以有充分的理由,例如Corner
,但是通常也提供各种“帮助”功能以使这种类型的工作更顺畅。
对于Corner
类型,您可以定义以下函数:
let cornerX (Corner(x, _)) = x
let cornerY (Corner(_, y)) = y
在这里,我假设Corner
为坐标建模,但如果您愿意,还可以将函数命名为fst
和snd
。如果您愿意,也可以将它们放在专用模块中。
这将使您能够从Corner
值中提取和管道值,而无需临时变量的麻烦:
> corner |> cornerX |> ((*) 10) |> string;;
val it : string = "10"
其中corner
定义为OP。
答案 1 :(得分:5)
我认为这意味着
type Corner = Corner of int*int
在这种情况下,这将获得第一个值:
let (Corner(first,_)) = corner