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)
您可以使用Microsoft.FSharp.Reflection
命名空间的反射,但它更加麻烦和缓慢。
模式匹配可能是从可区分联合获取数据的最简单方法。
(您还有一份Things
恰好属于Elephant
工会案件的所有成员的列表)。
归档时间: |
|
查看次数: |
209 次 |
最近记录: |