.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#答案,但你能说得更清楚些吗?