Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 在模式匹配中获取区分并集的大小写标识符_.net_F#_Functional Programming_Pattern Matching_Ocaml - Fatal编程技术网

.net 在模式匹配中获取区分并集的大小写标识符

.net 在模式匹配中获取区分并集的大小写标识符,.net,f#,functional-programming,pattern-matching,ocaml,.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 我想通过将Number和Integ

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

例如:

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
与or
|
模式相结合来缩短此函数。如何获取推断的案例标识符以使以下函数正常工作:

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"

如果你做了
let calculate'x=match x with
,而不是
let calculate'=function
,那么你就可以检查匹配框内的
x
。@ildjarn但是
x
有类型
type
,我怎么才能得到匹配框内的
数字
整数
,如果您的流程不同,则不希望合并案例。在一种情况下,您返回一个
数字
,在另一种情况下,您返回一个
整数
@RichouHunter,但底层过程是相同的(计算
i+1的值
),不同之处在于我必须将此结果强制转换为
Number
Integer
。您有多个语言标记,但无法精确确定使用的是哪一个。这是自愿的吗?你似乎想要一个F#答案,但你能说得更清楚些吗?