2014-09-06 30 views
2

我有一个函数num_order rank -> int定义。OCaml这不是一个函数;它不能应用

下面的函数调用将导致一个错误

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

Line 1: Error: This expression has type int

This is not a function; it cannot be applied. 

这似乎是第一线,是造成问题的原因......但是当我删除第二行中,错误消失。

回答

4

声明

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) 

因为函数applica优先于二元运算符如>。考虑到这一点,编译器的错误信息应该很清楚。

要在互动的顶层,你可能会写他们两个语句单独作为

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交互循环中,;;序列可用于分隔短语。虽然在编写常规程序时也支持这种方式,但这通常被认为是增强交互式顶层代码和常规程序代码之间兼容性的一种拙劣构造。

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

+1

哦!非常感谢 !这正是我所困惑的:),你能解释一下关于';'和';;'的用法吗? :) – cyc115 2014-09-07 02:51:17

+0

';;'只是一个与顶层相关的人造物,它需要用信号表示评估短语的结束 - 注意一个单独的“;”不会。编译器不需要这个短语语句的结尾,因为它不需要尽快评估一个句子,并且无论如何都有文件标记的结束。编译器也可以理解'';''作为一种方便。 – 2015-08-29 16:48:58

1

我需要在第一行的末尾添加;;。也可以编写如下(我认为这是比较正确的):

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

不是说如果OP在文件中做它。 – 2014-09-07 12:07:48

相关问题