我已经编写了这个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
答案 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