如何解决如何简化嵌套模式匹配子句?
我嵌套了带有很多 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
函数
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。