2015-02-23 68 views
-1

我想寫一個函數,它將返回列表中第二小的數字。我不斷收到一個語法錯誤,但我無法真正查明問題所在。我可以請幫助嗎?這裏的語法錯誤究竟是什麼?

刪除代碼

+0

我還是不明白我寫的是什麼問題。你能爲我指點嗎? – user3567081 2015-02-23 07:25:55

+0

不要刪除問題的重要部分。 – camlspotter 2015-02-24 06:49:46

回答

1

你忘了使用in關閉當地let綁定。正確的(和縮進)代碼應該是:

let second_smallest_helper1 lst= 
    let second_smallest_helper2 currentMinimum currentNumber = 
    if currentMinimum < currentNumber then currentMinimum else currentNumber 
    in List.fold_left second_smallest_helper2 (List.hd lst) lst 
;; 

let delete (x, mylist) = List.filter (fun y -> y != x) mylist;; 

let second_smallest myList = 
    let x = second_smallest_helper1 myList in 
    let newList = delete (x,myList) in 
    second_smallest_helper1 newList 
;; 

頂級let結合的形式

let <pattern> = <expression>;; (* ;; is optional, but beginners should have it *) 

但當地let結合的形式

let <pattern> = <expression> in <expression> 

你絕對需要使用一個適合你的編輯器的OCaml縮進工具,以避免這種錯誤。

還有一件事。我不確定你使用0​​是否可以。這是物理指針比較。可能你想使用<>,進行結構比較。

由於「個人原因」,OP試圖編輯並刪除所有答案。我自己跳過了編輯批准並將其留給了社區,這顯然拒絕了它。關於這種事情的Meta SO討論可以在What to do when an OP asks to delete my code from my answer?找到,包括OP應該做什麼。

+0

我同意物理/結構比較。身體比較不應該由初學者使用。 – PatJ 2015-02-23 07:40:23