.net - 获取模式匹配中可区分联合的大小写标识符

标签 .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 来缩短这个函数和 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

最佳答案

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"

关于.net - 获取模式匹配中可区分联合的大小写标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43522584/

相关文章:

f# - 结果类型的来源在哪里

haskell - 一份数据两种结构: Functional Programming vs Imperative Programming

functional-programming - 评估期间堆栈溢出(循环递归?)。奥卡米尔

c# - 将冗长的字符串(作为参数)传递到控制台应用程序

c# - 在 C# 中使用 DataContactSerializer 反序列化时出错

c# - 格式化十进制以在 XML 中使用并忽略文化

.net - 'service ... start' 指令对于 .NET Core 应用程序到底意味着什么?

f# - 如何在 F# 中实现接口(interface)

带有 <"string"的 F# 构造函数,str>

haskell - 函数式编程是否表现出控制流?