【发布时间】:2018-02-11 08:40:09
【问题描述】:
假设我有一个大的可区分联合类型:
type Thing =
| One of int
| Two of string
| Three of bool option
...
我有这个功能:
let comp a b = match a, b with
| One _, One _ -> true
| Two _, Two _ -> true
...
| _, _ -> false
有没有办法以一种更简洁、更短的方式编写函数,而不需要我列出每个构造函数?
【问题讨论】:
-
你可以使用reflection:
let comp a b = a.GetType() = b.GetType() -
@Funk 我没有意识到反射会如此简洁。这有缺点吗?
-
@TheQuickBrownFox:它利用了 DU 案例在 IL 中如何编译成嵌套类的优势。从实际的角度来看,这并不是一个巨大的缺点,但重要的是要认识到 F# 构造是如何编译到 IL 中的(这并不总是直截了当的),因为这是您在使用反射 API 时工作的层。
-
@TheQuickBrownFox:它也肯定会更慢,但如果在这种特殊情况下这是一个问题,你可以称自己很幸运。
-
GetType()仅在案例有参数时才有效;没有参数的情况不会编译到嵌套的子类中。
标签: function f# functional-programming pattern-matching