OCaml这不是函数;它不能被应用

cyc*_*115 3 ocaml functional-programming

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

以下函数调用将导致错误

let dom_rank r1 r = (num_order r1) > (num_order r)
dom_rank Seven Eight
Run Code Online (Sandbox Code Playgroud)

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

  This is not a function; it cannot be applied.
Run Code Online (Sandbox Code Playgroud)

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

Adè*_*Sec 6

该声明

let dom_rank r1 r = (num_order r1) > (num_order r)
dom_rank Seven Eight
Run Code Online (Sandbox Code Playgroud)

与...完全一样

let dom_rank r1 r = (num_order r1) > (num_order r) dom_rank Seven Eight
Run Code Online (Sandbox Code Playgroud)

要么

let dom_rank r1 r = (num_order r1) > ((num_order r) dom_rank Seven Eight)
Run Code Online (Sandbox Code Playgroud)

因为函数应用程序优先于二进制运算符(如>。考虑到这一点,编译器的错误消息应该很清楚。

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

let dom_rank r1 r = (num_order r1) > (num_order r);;
dom_rank Seven Eight;;
Run Code Online (Sandbox Code Playgroud)

在互动式顶层,或

let dom_rank r1 r = (num_order r1) > (num_order r)
let dr78 = dom_rank Seven Eight
Run Code Online (Sandbox Code Playgroud)

在模块定义中,还为您计算的值命名。

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

let () = print_endline "Hello, World!"
Run Code Online (Sandbox Code Playgroud)

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

;是用于在若干个表达式在一个表达结合序列操作。不应;;仅将其表示句子的结尾与之混淆。