【问题标题】:OCaml: Using a comparison operator passed into a functionOCaml:使用传递给函数的比较运算符
【发布时间】:2011-11-24 21:33:48
【问题描述】:

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

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

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

我希望这段代码的计算结果为(如果传入了“=”):

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

但是,这不起作用。特别是,它认为 x 是一个布尔值,如以下错误消息所示:

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

我该如何做我想做的事?

关于一个附带问题,我怎么能自己解决这个问题,这样我就不必依赖论坛的外部帮助了?有什么好的资源?

【问题讨论】:

  • 另请注意,一旦将其包含在变量中,就不能将它们用作内联运算符。

标签: function functional-programming ocaml comparator


【解决方案1】:

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

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

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

【讨论】:

【解决方案2】:

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

【讨论】:

    【解决方案3】:

    几种可能性:

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

    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 
    

    【讨论】:

    • 另一个注意事项:如果您将电池用作 |> 和
    猜你喜欢
    • 2019-11-18
    • 1970-01-01
    • 2016-12-21
    • 2018-12-23
    • 1970-01-01
    • 2018-10-28
    • 2015-02-16
    • 1970-01-01
    • 2011-01-12
    相关资源
    最近更新 更多