代码之家  ›  专栏  ›  技术社区  ›  Thomas

在F#中,一个匹配表达式是否可以“穿过”另一个匹配?像C语言还是C++?

  •  0
  • Thomas  · 技术社区  · 5 年前

    在C++中,您可以打开一个开关/ case构造,省略case语句中的中断,以便执行下一个实例的执行。

    这可以在F#里做吗?

    举例说明:

    switch (a)
    case "a":
        ...
        break;
    case "b":
        ...
        goto case "a"
    case "c":
        ...
    

    match x with
    | "a" -> ...
    | "b" -> ...  + goto "a"
    

    一个实际的例子是:

    • “a”做些手术
    • “b”重置计数器,然后执行与“a”相同的操作

    您需要避免代码重复,还要将代码放在外部函数中。

    0 回复  |  直到 5 年前
        1
  •  4
  •   kagetoki    5 年前

    是一种基于表达式的语言,因此它没有命令式的特性,比如 goto 但是,您仍然可以表达相同的逻辑。首先,你可以合并“案例”:

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

    let test str =
       let onEmpty() = printf "empty!!!"
       match str with
       | null ->
           onEmpty()
           printf "null!"
       | "" -> onEmpty()
       | str -> printf "String [%s]" str
    
        2
  •  1
  •   Egor Samets    5 年前
    let aFun() = ...
    let bFun() = ...
    let abFun() = aFun >> bFun
    

    或者像这样,哪个更适合你的情况

    let abFun() = 
         aFun() |> ignore
         bFun()
    

    F#约束你做一些更有功能的事情。 goto

    match x with
    | "a" -> aFun()
    | "b" -> abFun()