仅打印 Union 类型的案例

Print only cases of Union Type

我有这段代码,目的是只打印 Union 类型的案例 Event:

type CustomerPromoted = { id: string; level: int }
type CustomerCreated = { id: string; companyName: string }
type Event =
  | Created of CustomerCreated
  | Promoted of CustomerPromoted

let printEvents (events: Event list) =
  events
  |> List.iter (fun event -> printfn "%A" event)

[<EntryPoint>]
let main argv =
  let created = { id = "1"; companyName = "MS" }
  let promoted = { id = "1"; level = 3 }
  printEvents [ created, promoted ]
  0

但行

printEvents [ created, promoted ]

导致此错误:

This expression was expected to have type 'Event' but here has type ''a * 'b'

我该如何解决这个问题?

我可以只使用 let printEvents (events) 但是我会有这个签名:'a list -> unit 我想要 Event list -> unit

[ created, promoted ]CustomerCreated * CustomerPromoted 类型元组的单元素列表。所以第一个修复是使用列表分隔符 ; 而不是元组分隔符 ,[ created; promoted ]

第二个修复是注意受歧视的联合不是别名。 Created 属于 Event 类型,其中包含 CustomerCreated 类型的数据。因此,将 let created = { id = "1"; companyName = "MS" } 更改为 let created = Created { id = "1"; companyName = "MS" } 将创建您想要的类型。