如何在 ->
之后获得推断类型在模式匹配中?
例如:
type Type =
| Complex1
| Complex2
| Number of int
| Integer of int
let calculate = function
| Number i -> Number (i + 1)
| Integer i -> Integer (i + 1)
| Complex1 | Complex2 as t -> t
我想通过组合
Number
来缩短这个函数和 Integer
或 |
图案。如何获取推断的案例标识符以使以下功能起作用:let calculate' = function
| Number i | Integer i ->
// If this is Number, return Number (i + 1)
// Else return Integer (i + 1)
| Complex1 | Complex2 as t -> t
最佳答案
如 Integer
和 Number
语义不同,您不想合并它们。几个月后,这将很难破译并理解您的意思。语义差异应转化为技术差异。这是一件好事。
现在,如果它们真的相同,并且只是出于某种元目的由不同的案例表示,那么您的数据结构是错误的:它并不代表这两个案例实际上是同一案例的事实。为了正确地表示这一事实,将它们合并为一个案例,并添加一个标记来标识数字的种类:
type NumberKind = Integer | Other
type Type =
| Complex1
| Complex2
| Number of NumberKind * int
let calculate = function
| Number (kind, i) -> Number (kind, i + 1)
| Complex1 | Complex2 as t -> t
注意:如果您确实发现自己需要区分这两者,您仍然可以对它们进行匹配:
let kind = function
| Number (Integer, _) -> "integer"
| Number (Other, _) -> "number"
| Complex1 -> "complex 1"
| Complex2 -> "complex 2"
关于.net - 获取模式匹配中可区分联合的大小写标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43522584/