如何简化嵌套模式匹配子句?
How can I simplify nested pattern matching clauses?
我的嵌套数据类型有很多 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 语法中可能吗?
或者可能有一些设计模式可以帮助我在设计用户定义的数据类型时避免这个问题?
模式也可以嵌套,所以你可以这样做:
let func = function
| Some Ty1 -> Printf.printf "Ty1\n"
| Some Ty2 -> Printf.printf "Ty2\n"
| None -> Printf.printf "None\n"
您可以通过定义两个函数来避免这种嵌套模式匹配:
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
函数
我的嵌套数据类型有很多 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 语法中可能吗?
或者可能有一些设计模式可以帮助我在设计用户定义的数据类型时避免这个问题?
模式也可以嵌套,所以你可以这样做:
let func = function
| Some Ty1 -> Printf.printf "Ty1\n"
| Some Ty2 -> Printf.printf "Ty2\n"
| None -> Printf.printf "None\n"
您可以通过定义两个函数来避免这种嵌套模式匹配:
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
函数