2015-02-23 69 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