模式匹配是获取与union案例相关联的数据的唯一方法吗?

Mic*_*ett 9 f# pattern-matching

假设你有这个联盟:

type Thing = 
| Eagle
| Elephant of int
Run Code Online (Sandbox Code Playgroud)

你的代码有一个大象列表,如

let l = [Elephant (1000); Elephant (1200)]
Run Code Online (Sandbox Code Playgroud)

并且您希望迭代l,并打印出与每个相关的数据Elephant.有没有办法在不使用模式匹配的情况下这样做?

Tom*_*cek 11

在你的例子中,你说你有一个大象列表 - 在这种情况下也是如此 - 但是它的类型l实际上是一个Thing值列表,所以它可以包含大象和鹰.这就是为什么你需要使用模式匹配 - 来处理所有可能的情况.

如果您经常需要使用包含大象的列表,那么定义一个单独类型的大象可能是有意义的.就像是:

type ElephantInfo = { Size : int }

type Thing = 
  | Elephant of ElephantInfo
  | Eagle
Run Code Online (Sandbox Code Playgroud)

现在您可以创建一个list<ElephantInfo>只包含大象的类型列表,因此您不需要模式匹配:

let l1 = [ {Size=1}; {Size=2} ]
for el in l1 do printfn "%d" el.Size
Run Code Online (Sandbox Code Playgroud)

另一方面,如果你想混合大象和鹰,你将创建list<Thing>然后使用模式匹配:

let l2 = [ Elephant {Size=1}; Eagle ]
Run Code Online (Sandbox Code Playgroud)


Pet*_*etr 1

您可以使用Microsoft.FSharp.Reflection命名空间的反射,但它更加麻烦和缓慢。

模式匹配可能是从可区分联合获取数据的最简单方法。

(您还有一份Things恰好属于Elephant工会案件的所有成员的列表)。