我是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
我该怎样做我想做的事情?
关于一个问题,我怎么能自己想出这个问题所以我不必依赖论坛的外界帮助?有哪些好的资源?
答案 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资源:
答案 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