OCaml这不是一个功能;它无法应用

时间:2014-09-06 15:10:33

标签: functional-programming ocaml

我定义了一个函数num_order rank -> int

以下函数调用将导致错误

let dom_rank r1 r = (num_order r1) > (num_order r)
dom_rank Seven Eight
  

第1行:错误:此表达式的类型为int

  This is not a function; it cannot be applied.

它似乎是导致问题的第一行......但是当我删除第二行时,错误就消失了。

2 个答案:

答案 0 :(得分:6)

声明

let dom_rank r1 r = (num_order r1) > (num_order r)
dom_rank Seven Eight

完全相同
let dom_rank r1 r = (num_order r1) > (num_order r) dom_rank Seven Eight

let dom_rank r1 r = (num_order r1) > ((num_order r) dom_rank Seven Eight)

因为函数应用程序优先于>等二元运算符。考虑到这一点,编译器的错误消息应该非常清楚。

要将这两个语句分开,您可能会将它们写为

let dom_rank r1 r = (num_order r1) > (num_order r);;
dom_rank Seven Eight;;

在交互式顶层或

let dom_rank r1 r = (num_order r1) > (num_order r)
let dr78 = dom_rank Seven Eight

在模块定义中,也为您计算的值指定名称。

触发仅具有副作用的功能的常用方法是使用特殊的

let () = print_endline "Hello, World!"

不要对使用OCaml交互式循环和常规编程之间的差异感到困惑。在OCaml交互循环中,可以评估单个表达式,其具有打印结果值的副作用。在编写OCaml程序时,评估表达式是一个错误,我们应该使用let绑定。在OCaml交互循环中,;;序列可用于分隔短语。虽然这也支持编写常规程序,但这通常被视为一种hacky结构,用于增强交互式顶层代码和常规程序代码之间的兼容性。

;是用于在一个表达式中组合多个表达式的序列运算符。它不应该与;;混淆,{{1}}仅表示句子的结尾。

答案 1 :(得分:1)

我需要在第一行的末尾添加;;。也可以写下面的内容(我认为这更正确):

let dom_rank r1 r = (num_order r1) > (num_order r)
let _ = dom_rank Seven Eight