如何简化嵌套模式匹配子句?

问题描述 投票:0回答:2

我有带有很多

option
修饰符的嵌套数据类型。当我需要
match
嵌套类型时,我想简化函数的源代码。

考虑示例:

type ty = Ty1 | Ty2

let func = function
  | Some v -> begin
    match v with
    | Ty1 -> Printf.printf "Ty1\n"
    | Ty2 -> Printf.printf "Ty2\n"
  end
  | None -> Printf.printf "None\n"

let () =
  Printf.printf "\n";
  let _ =  func @@ Some(Ty1) in ()

大量嵌套类型,我的代码变得非常庞大。

相反,我想写这样的东西:

let func = function
  | Some v when (v == Ty1) -> Printf.printf "Ty1\n"
  | Some v when (v == Ty2) -> Printf.printf "Ty2\n"
  | None -> Printf.printf "None\n"

我的问题的最佳解决方案是什么? OCaml 语法可以吗?

或者可能有一些设计模式可以帮助我在设计用户定义的数据类型时避免这个问题?

pattern-matching ocaml
2个回答
3
投票

模式也可以嵌套,所以你可以这样做:

let func = function
  | Some Ty1 -> Printf.printf "Ty1\n"
  | Some Ty2 -> Printf.printf "Ty2\n"
  | None -> Printf.printf "None\n"

1
投票

您可以通过定义两个函数来避免这种嵌套模式匹配:

type ty = Ty1 | Ty2

let ty_to_string = function
  | Ty1 -> "Ty1"
  | Ty2 -> "Ty2"

let func o = 
  Option.fold ~none:"None" ~some:ty_to_string o 
  |> Printf.printf "%s\n"

let () =
  Printf.printf "\n";
  let _ =  func @@ Some(Ty1) in ()

在我看来,它更具可重用性,因为无论如何你最终可能都需要

ty_to_string
功能

© www.soinside.com 2019 - 2024. All rights reserved.