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 " "
您几乎可以大声朗读这段代码来了解它的作用。它以一个句子开头,过滤其中的空词,然后用空格将它们连接起来。
我对如何在 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 " "
您几乎可以大声朗读这段代码来了解它的作用。它以一个句子开头,过滤其中的空词,然后用空格将它们连接起来。