如何在模式匹配中获得->
之后的推断类型?
例如:
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
答案 0 :(得分:11)
如果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"