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

MiP*_*MiP 3 .net f# ocaml functional-programming pattern-matching

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

例如:

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
Run Code Online (Sandbox Code Playgroud)

我想通过合并来缩短这个功能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
Run Code Online (Sandbox Code Playgroud)

Fyo*_*kin 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
Run Code Online (Sandbox Code Playgroud)

注意:如果你发现自己需要区分这两者,你仍然可以匹配它们:

let kind = function
  | Number (Integer, _) -> "integer"
  | Number (Other, _) -> "number"
  | Complex1 -> "complex 1"
  | Complex2 -> "complex 2"
Run Code Online (Sandbox Code Playgroud)