假设您有这样的类型:
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 中定义。
关于f# - 如何引用封装在单例区分联合中的元组的第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34374768/