在模式匹配中获取区分联合的案例标识符

时间:2017-04-20 14:36:12

标签: .net f# functional-programming pattern-matching ocaml

如何在模式匹配中获得->之后的推断类型?

例如:

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

我想通过将NumberInteger|模式相结合来缩短此功能。如何获取推断的案例标识符以使以下功能起作用:

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

1 个答案:

答案 0 :(得分:11)

如果IntegerNumber在语义上不同,则您想要来合并它们。几个月之后难以破译并理解你的意思。语义差异应转化为技术差异。这是件好事。

现在,如果他们真的 相同,并且只是出于某些元目的而由不同的情况表示,那么你的数据结构是错误的:它并不代表这两个案例真的是这样的事实同样的情况。为了正确表示这一事实,将它们折叠成一个案例,并添加一个标识数字类型的标记:

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"