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

标签 f#

假设您有这样的类型:

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为坐标建模,但如果您愿意,也可以将函数命名为 fstsnd .如果您愿意,也可以将它们放在专用模块中。

这将使您能够从 Corner 中提取和传递一个值。没有临时变量麻烦的值:
> corner |> cornerX |> ((*) 10) |> string;;
val it : string = "10"

在哪里 corner在 OP 中定义。

关于f# - 如何引用封装在单例区分联合中的元组的第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34374768/

相关文章:

f# - F# 函数签名的字符串表示形式

c# - F#该表达式应具有EventHandler类型,但此处具有类型unit

c# - 是否可以在 PropertyGrid 中查看公共(public)属性以外的成员?

f# - 如何引用 TypeProvider 创建的 'generated' 类型

F# 不可变类互操作

f# - F# 中获取集合的幂集的函数

f# - 在 F# 中通过组合定义 EntryPoint

f# - 为什么F#的Seq.windowed返回数组的seq

f# - F#中类型约束的顺序

f# - F# 如何从 AND 运算返回 bool 值?