我定义了一个函数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.
它似乎是导致问题的第一行......但是当我删除第二行时,错误就消失了。
答案 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