Sec*_*ret 5 ocaml functional-programming
我已经开始喜欢OCaml中的这种语法
match myCompare x y with
|Greater->
|Less->
|Equal->
Run Code Online (Sandbox Code Playgroud)
但是,它需要2个东西,一个自定义类型,以及一个返回我的自定义类型的myCompare函数.
如果没有采取上述步骤,是否还有这样做?
pervasives模块似乎有'compare',如果相等则返回0,当更大时返回pos int,当less时返回neg int.有可能匹配那些吗?从概念上讲是这样的(不编译):
match myCompare x y with
| (>0) ->
| (0) ->
| (<0) ->
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用if语句,但模式匹配对我来说更优雅.这样做有一种简单的方法(如果不是标准的话)吗?
有这么简单的方法吗?
没有!
的优势match在什么switch用另一种语言确实是OCaml中的match告诉你,如果你有没有想过覆盖所有的情况下(它允许深度匹配,并更有效地编译,但是这也可以认为是种优势).如果你做了一些愚蠢的事情,如果你开始使用任意条件而不是模式,你将失去被警告的优势.你最终会得到一个具有与a相同缺点的结构switch.
这说,实际上,是的!
你可以写:
match myCompare x y with
| z when (z > 0) -> 0
| 0 -> 0
| z when (z < 0) -> 0
Run Code Online (Sandbox Code Playgroud)
但是when如果你做一些愚蠢的事情,使用会让你失去被警告的优势.
type comparison = Greater | Less | Equal三个唯一构造函数上的自定义类型和模式匹配是正确的方法.它记录的是什么myCompare,而不是让它返回一个int也可以用另一种语言表示文件描述符.类型定义没有任何运行时成本.在这个例子中没有理由不使用它.