f# - 模式匹配是获取与联合案例关联的数据的唯一方法吗?

标签 f# pattern-matching

假设您有这个联合:

type Thing = 
| Eagle
| Elephant of int

您的代码中有一个Elephants列表,如
let l = [Elephant (1000); Elephant (1200)]

您想遍历l并打印出与每个Elephant相关的数据。有没有一种方法可以不使用模式匹配?

最佳答案

在您的示例中,您说您有一个大象列表-在这种情况下是正确的-但l的类型实际上是Thing值的列表,因此它可以同时包含大象和老鹰。这就是为什么您需要使用模式匹配-处理所有可能的情况的原因。

如果您经常需要使用仅包含大象的列表,则可以定义一个单独的大象类型。就像是:

type ElephantInfo = { Size : int }

type Thing = 
  | Elephant of ElephantInfo
  | Eagle

现在,您可以创建一个list<ElephantInfo>类型的列表,该列表可以只包含大象,因此不需要模式匹配:
let l1 = [ {Size=1}; {Size=2} ]
for el in l1 do printfn "%d" el.Size

另一方面,如果您想混合大象和老鹰,则将创建list<Thing>,然后使用模式匹配:
let l2 = [ Elephant {Size=1}; Eagle ]

关于f# - 模式匹配是获取与联合案例关联的数据的唯一方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30486984/

相关文章:

oop - 帮助设计树结构 - 函数式和 OOP 之间的张力

f# - 从 FSharp 中的函数返回函数时无法理解类型推断

pattern-matching - 了解具有多个子句的 Elixir 函数

scala - 匹配案例的Scala返回值

f# - 存在同名属性时如何调用扩展方法?

f# - 具有可选属性的 JSON 类型提供程序的数据示例

java - java中基于属性文件的条件模式

pattern-matching - 如何在单个 Racket 的比赛模式中多次使用同一个绑定(bind)?

swift - Swift 枚举的非详尽模式匹配

build - 我对我应该引用哪个 fsharp.core 以及如何去做感到困惑