在 F# 中,匹配表达式可以“通过”另一个匹配吗?就像在 C# 或 C++ 中一样?

Tho*_*mas 2 f# switch-statement

在 C++ 中,您可以使用 switch / case 构造并省略 case 语句中的 break 以使执行在下一个 case 中失败。

在 C# 中,这是通过 goto 案例完成的。

这可以在 F# 中完成吗?

AC#示例来说明:

switch (a)
case "a":
    ...
    break;
case "b":
    ...
    goto case "a"
case "c":
    ...
Run Code Online (Sandbox Code Playgroud)

我会想象这样的事情:

match x with
| "a" -> ...
| "b" -> ...  + goto "a"
Run Code Online (Sandbox Code Playgroud)

一个实际的例子是这样的情况:

  • "a" 做一些操作
  • "b" 重置计数器,然后执行与 "a" 相同的操作

并且您希望避免代码重复,但也希望将代码放在外部函数中。

kag*_*oki 5

F# 是一种基于表达式的语言,因此它没有像goto. 但是,您仍然可以表达相同的逻辑。首先,您可以组合“案例”:

let test str =
   match str with
   | (null|"") -> printf "empty"
   | str -> printf "String: [%s]" str
Run Code Online (Sandbox Code Playgroud)

当然,如果您只想重用某些 case 逻辑的一部分,您可以在本地函数中提取它:

let test str =
   let onEmpty() = printf "empty!!!"
   match str with
   | null ->
       onEmpty()
       printf "null!"
   | "" -> onEmpty()
   | str -> printf "String [%s]" str
Run Code Online (Sandbox Code Playgroud)