OCaml:和关键字语法错误

时间:2017-11-06 18:37:54

标签: syntax-error ocaml

我已经编写了这个mergesort实现,如果我将divide函数放在mergesort函数之外,它可以正常工作。但是当我尝试将mergesort的内部函数划分时,我遇到了语法错误。

我知道,必须有一些非常简单的解释。我在互联网上看了一眼,却一无所获。

以下是代码:

let mergesort list = 
  let rec sort lists acc = (
    let rec merge sublist1 sublist2 merged_list =
    match sublist1 with
      |[] -> merged_list @ sublist2
      |hd1 :: tl1 -> 
        match sublist2 with
          |[] -> merged_list @ sublist1
          |hd2 :: tl2 -> 
            if hd1 < hd2 then merge tl1 sublist2 (merged_list @ hd1::[])
            else merge sublist1 tl2 (merged_list @ hd2::[])
    in match lists with 
      |[] -> 
        (match acc with
          |[] -> []
          |hd :: [] -> hd
          |_ -> sort acc [])
      |hd :: tl -> sort (List.tl tl) ((merge (List.hd tl) hd [])::acc)  
  )
  and rec divide list list_of_lists = (
    match list with
      [] -> list_of_lists
      |hd :: tl -> divide tl ((hd :: []) :: list_of_lists)
  )
  in sort (divide list []) []
;; 

并导致:

Characters 567-570:
and rec divide list list_of_lists = (
    ^^^
Error: Syntax error

2 个答案:

答案 0 :(得分:2)

local definition在OCaml中具有以下语法:

let [rec] pattern1 =  expr1 and … and  patternN =  exprN in expr

因此,在rec关键字后不允许额外and,并且仅在第一个let之后才允许。 rec标志扩展到本地定义中定义的所有值,因此您只需在rec之后删除此错误的and

答案 1 :(得分:1)

您只需从您的定义中删除rec关键字。

这是因为当您使用and关键字时,您会在语法上有效地重复先前的定义,在本例中为let rec

因此,您当前的实施与let rec rec

实际上相同