OCaml 中的嵌套函数及其参数

Nested functions in OCaml and their parameters

我对如何在 OCaml 中实现嵌套函数有疑问,我需要一个函数的输出(列表)作为另一个函数的输入。两者都应该是递归的。问题是我玩弄了这些参数,但它们没有正确提供:

let toComb sentence =  
  let rec listCleanup sentence = 
    match sentence with
    | [] -> []
    | h::t when h = "" -> listCleanup t
    | h::t -> h::listCleanup t
  in
  let rec toString listCleanup sentence = 
    match listCleanup sentence  with
    | [] -> ""
    | [element] -> element
    | h::t -> h ^ " " ^ toString listCleanup sentence  
  in 
  toString listCleanup sentence;;

如果我将函数及其参数用作参数,则会出现堆栈溢出,但如果我仅使用不带参数的函数,则会出现参数不匹配。这里应该解决什么问题?

要更正您的代码,以下是可以正常工作的代码:

let to_comb sentence =
  let rec cleanup s = match s with
    | [] -> []
    | ""::tail -> cleanup tail
    | hd::tail -> hd::cleanup tail in
  let rec to_string s = match s with
    | [] -> ""
    | [x] -> x
    | hd::tail -> hd ^ " " ^ to_string tail in
  to_string (cleanup s)

请注意,我只调用 cleanup 一次,因为您只需要清理整个序列一次。然而,事实证明这两个函数都可以用预定义的 OCaml 函数更简单地表达:

let to_comb sentence =
  sentence
  |> List.filter (fun s -> s <> "")
  |> String.concat " "

您几乎可以大声朗读这段代码来了解它的作用。它以一个句子开头,过滤其中的空词,然后用空格将它们连接起来。