假设你有这样的类型:
type Corner = Corner of int*int
然后是一些变量:
let corner = Corner (1,1)
是否有可能获得元组的第一个元素的值,如:
fst corner
看起来像某种展开int*int
是必要的.
@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.
我认为那是有意义的
type Corner = Corner of int*int
在这种情况下,这将获得第一个值:
let (Corner(first,_)) = corner