OCaml:使用传递给函数的比较运算符

时间:2011-09-26 02:44:31

标签: function functional-programming ocaml comparator

我是OCaml菜鸟。我正在试图弄清楚如何处理传递给函数的比较运算符。

我的函数只是尝试传入一个比较运算符(=,<,>等)和一个int。

let myFunction comparison x = 
if (x (comparison) 10) then 
   10
else
   x;;

我希望这段代码能够评估(如果传入“=”):

if (x = 10) then
   10
else
   x;;

但是,这不起作用。特别是,它认为x是一个bool,如此错误消息所示:

This expression has type 'a -> int -> bool
but an expression was expected of type int

我该怎样做我想做的事情?

关于一个问题,我怎么能自己想出这个问题所以我不必依赖论坛的外界帮助?有哪些好的资源?

3 个答案:

答案 0 :(得分:10)

<=之类的比较运算符是秘密的双参数(二进制)函数。要将它们作为参数传递,请使用(<)表示法。要在函数中使用该参数,只需将其视为函数名称:

let myFunction comp x = 
  if comp x 10 then 
     10
  else
     x;;

printf "%d" (myFunction (<) 5);; (* prints 10 *)

答案 1 :(得分:4)

OCaml允许您通过将中缀运算符括在括号中来将其视为标识符。这不仅适用于现有操作员,也适用于您要定义的新操作员。它们可以显示为函数名称,甚至可以显示为参数。它们必须由符号字符组成,并且具有与其第一个字符相关联的优先级。因此,如果您真的想要,可以使用中缀表示法作为myFunction的比较参数:

        Objective Caml version 3.12.0
# let myFunction (@) x =
      x @ 10;;
val myFunction : ('a -> int -> 'b) -> 'a -> 'b = <fun>
# myFunction (<) 5;;
- : bool = true
# myFunction (<) 11;;
- : bool = false
# myFunction (=) 10;;
- : bool = true
# myFunction (+) 14;;
- : int = 24
# 

(目前尚不清楚这会让myFunction更容易阅读。我认为应该谨慎地定义新的中缀运算符。)

要回答您的问题,此其他StackOverflow页面上列出了大量OCaml资源:

  

https://stackoverflow.com/questions/2073436/ocaml-resources

答案 2 :(得分:2)

几种可能性:

使用新定义重新定义比较运算符:

let myFunction comparison x =
  let (@) x y = comparison x y in
  if (x @ 10) then 
    10
  else
    x;;

您也可以直接传递@而无需额外定义。

作为另一种解决方案,您可以使用一些辅助函数来定义所需内容:

let (/*) x f = f x
let (*/) f x = f x

let myFunction comparison x =
  if x /* comparison */ 10 then
    10
  else 
    x