2014-09-06 60 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