Functional programming 匹配比较OCaml

Functional programming 匹配比较OCaml,functional-programming,ocaml,Functional Programming,Ocaml,我开始喜欢OCaml中的这种语法 match myCompare x y with |Greater-> |Less-> |Equal-> 但是,它需要两件事,一个自定义类型和一个返回自定义类型的myCompare函数 如果不执行上述步骤,是否仍有必要执行此操作 pervasives模块似乎有“compare”,如果相等,则返回0;如果较大,则返回pos int;如果较小,则返回neg int。有可能匹配这些吗?在概念上与此类似(不编译): 将myCompare x y与 |

我开始喜欢OCaml中的这种语法

match myCompare x y with
|Greater->
|Less->
|Equal->
但是,它需要两件事,一个自定义类型和一个返回自定义类型的myCompare函数

如果不执行上述步骤,是否仍有必要执行此操作

pervasives模块似乎有“compare”,如果相等,则返回0;如果较大,则返回pos int;如果较小,则返回neg int。有可能匹配这些吗?在概念上与此类似(不编译):

将myCompare x y与
| (>0) ->
| (0)  ->
| (
我知道我可以只使用if语句,但模式匹配对我来说更优雅。有没有一种简单(如果不是标准)的方法

有没有一种简单的方法可以做到这一点

match
与另一种语言中的
switch
相比的优势在于,OCaml的
match
告诉您是否考虑过覆盖所有情况(它允许深入匹配,编译效率更高,但这也可以被视为类型的优势)。如果你做了一些愚蠢的事情,如果你开始使用任意条件而不是模式,你将失去被警告的优势。你将得到一个与
开关
具有相同缺点的构造

这是说,事实上,是的

你可以写:

match myCompare x y with
| z when (z > 0) -> 0
| 0 -> 0
| z when (z < 0) -> 0
将myCompare x y与
|当(z>0)->0时的z
| 0 -> 0
|当(z<0)->0时的z
但是当你做了愚蠢的事情时,使用
会使你失去被警告的优势


自定义类型
type comparison=bether | Less | Equal
和仅三个构造函数上的模式匹配是正确的方法。它记录了
myCompare
所做的事情,而不是让它返回一个
int
,该int也可以在另一种语言中表示文件描述符。类型定义没有任何运行时成本。没有理由不在本例中使用。您可以使用已经提供这些变量返回比较功能的库。例如,电池模块就是这样

否则,最好是定义类型并创建从整数到比较的转换函数

type comparison = Lt | Eq | Gt
let comp n =
  if n < 0 then Lt
  else if n > 0 then Gt
  else Eq

(* ... *)

match comp (Pervasives.compare foo bar) with
  | Lt -> ...
  | Gt -> ...
  | Eq -> ...
类型比较=Lt | Eq | Gt
让公司=
如果n<0,则Lt
否则,如果n>0,则Gt
埃尔斯方程
(* ... *)
将comp(pervisives.compare foo bar)与
|Lt->。。。
|Gt->。。。
|等式->。。。

+1,尽管我相信这个问题的动机是OCaml本身——不幸的是——使用带符号的整数进行比较运算。@AndreasRossberg我在写了我的答案/rant后意识到。好吧,Caml应该有一个
更大|更小|相等的
类型,并将其用于所有
比较
函数。它让我们不必再写
了,让我们也来比较一下吧(因为溢出,这不是一个传递关系)。比较这样的结果真是太可惜了:(+1,不过这是非常有用的一篇文章。)
type comparison = Lt | Eq | Gt
let comp n =
  if n < 0 then Lt
  else if n > 0 then Gt
  else Eq

(* ... *)

match comp (Pervasives.compare foo bar) with
  | Lt -> ...
  | Gt -> ...
  | Eq -> ...