匹配比较OCaml

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语句,但模式匹配对我来说更优雅.这样做有一种简单的方法(如果不是标准的话)吗?

Pas*_*uoq 7

有这么简单的方法吗?

没有!

的优势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也可以用另一种语言表示文件描述符.类型定义没有任何运行时成本.在这个例子中没有理由不使用它.

  • @AndreasRossberg我意识到写完答案后/咆哮.好吧,Caml真的应该有一个`更大| 减去| Equal`类型并将其用于所有`compare`函数.而且它会让我们免于编写`let compare_int xy = x - y`的人(因为溢出而不是传递关系). (3认同)
  • +1,尽管我相信这个问题的动机是 OCaml 本身 - 不幸的是 - 使用有符号整数进行比较操作。 (2认同)