当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何引用封装在单个案例区分联合中的元组的第一个元素》经验,为你挑选了2个好方法。

假设你有这样的类型:

type Corner = Corner of int*int

然后是一些变量:

let corner = Corner (1,1)

是否有可能获得元组的第一个元素的值,如:

fst corner

看起来像某种展开int*int是必要的.



1> Mark Seemann..:

@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.



2> Foole..:

我认为那是有意义的

type Corner = Corner of int*int

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

let (Corner(first,_)) = corner

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有