2014-09-03 31 views
0

我開始學習OCaml,並且一直困擾着一個簡單的問題。 我想用一個簡單的循環來計算我在6行文件中的字母數。 這裏是我的代碼:在OCaml中使用長度函數

let fi = open_in "example";; 
let string = "";; 
let nb_carac = 0;; 

for i = 0 to 6 do 
    string = input_line fi; 
    nb_carac = (nb_carac + String.length(string)); 
    done;; 

問題是,它似乎並沒有什麼指望,直接達到EOF。 我收到以下錯誤信息:

Warning 10: this expression should have type unit. 
Warning 10: this expression should have type unit. 
Exception: End_of_file. 

我真的不明白。我已經單獨嘗試了每條線,並且他們都工作。我究竟做錯了什麼?

謝謝!

+0

如果下面的後回答您的問題請[點擊接受檢查標誌](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。如果它仍然不能回答你的問題,請在你的問題中添加更多細節,這樣有人可以回答它。當您將答案標記爲已接受時,它會浮動到頂部,以便其他讀者可以儘快看到正在工作的答案,答案的作者將被授予一些聲望點。 – 2015-04-02 13:26:06

回答

2

OCaml沒有可變的變量。您應該使用tail recursionreferences。閱讀任何基本的OCaml教科書或教程。

兩條線:

string = input_line fi; 
nb_carac = (nb_carac + String.length(string)); 

被理解爲無用相等測試(這可以解釋你所得到的警告)。

也許你想:

(* shameful *) 
let string = ref "";; 
let nb_carac = ref 0;; 

然後例如

(* shameful *) 
string := input_line fi; 
nb_carac := !nb_carac + String.length(!string); 

但你應該得到一個非常糟糕的品位,如果你像OCaml中一個功能性的語言代碼,以便勢在必行。

作爲一個經驗法則,在OCaml編碼時避免變異數據。當然,這條規則有一些重要的例外。

您的練習的正確解決方案是使用不會改變任何數據的尾遞歸函數。看看OCaml標準庫stdlib/list.ml獲得一些靈感。

可能是一個更好的解決您的運動開始於

let count_lines_and_characters fil = (* incomplete code, fill the ... *) 
    let rec .... 
    in .... 
;; 

當然諸位應填寫....

+0

謝謝,它工作! 這確實很基礎。我應該更加小心,並且習慣它。 再次感謝您。 – Neor 2014-09-03 14:04:23

+0

順便說一句,什麼工作?使用像我上面做的參考是一個*恥辱*,你會得到一個不好的成績。你需要編寫一些本地的尾遞歸函數(我沒有爲你做這件事,因爲*你*需要*想*)。 – 2014-09-03 14:06:02

+0

那麼,目的是要找到一種方法來計算文件中的每一個字母與我的教訓,直到現在教我... 只是一個練習,以適應語言,一點一點。 – Neor 2014-09-03 14:12:01