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