函数表示return一个元组(length_of_element,element)

Function that return a tuple (length_of_element,element)

我想知道 OCAML 中是否有办法 return 字符串列表的字符串元素的长度和元素本身? 我想做这样的事情:

let (length_of_element,element) = List.map String.length ["Hello"; "World!"] in .....

我希望 in 关键字传递到代码的下一部分,即 length_of_element 元素的长度 "Hello" (如果我们在循环 0) 和元素本身,它是 "Hello"(如果我们在循环 0)

更新

let () =
        let t = Sys.time() in
        let args_n = Array.length Sys.argv - 1 in
        let args_list = Array.to_list (Array.sub Sys.argv 1 args_n) in
        List.iter (fun element ->
        let length_of_element = String.length element in
        let text = check_if_file(List.nth args_list 1) in
        let int_ls = search (to_list_ch element) text length_of_element) check_if_file(List.nth args_list 0 ) in
        if (List.length int_ls)> 1 then print_string "pattern found at characters "
        else if (List.length int_ls) = 1 then print_string "Pattern found at character "
        else print_string "No patterns found."
        ;
        print_ls int_ls;
        Printf.printf "Execution time: %fs\n" (Sys.time() -. t);;

在我使用此功能的案例中,check_if_file(List.nth args_list 0 ) 是我的列表。

我试图实现 Guillaume Melquiond 在他的回答中告诉我的内容,但我收到此错误:

Error: Syntax error: operator expected.

(错误指向这一行:

let int_ls = search (to_list_ch element) text length_of_element) check_if_file(List.nth args_list 0 ) in

有人知道这个错误是从哪里来的吗?

如有任何帮助,我们将不胜感激。

在OCaml中执行外部迭代是相当复杂的。将它们设置为内部要简单得多。这意味着您的代码主体需要传递给 List.map,而不是相反:

List.map (fun element ->
    let length_of_lement = String.length element in
    ... (* use element and length_of_element here *)
  ) ["Hello"; "World!"]

如果您不关心生成列表,只需使用 List.iter 而不是 List.map

第二个问题。

(理想情况下,您应该针对每个 Whosebug post 提出一个问题。)

您提取的文本有 3 个右括号,只有 1 个左括号。这可能与您的语法错误有关。

我能想到的最简单的方法是这样的:

List.map (fun s -> String.length s, s) ["Hello"; "Everyone"]

其中 returns :

- : (int * string) list = [(5, "Hello"); (8, "Everyone")]

至于你的编辑,这个:

let int_ls = search (to_list_ch element) text length_of_element) check_if_file(List.nth args_list 0 )

不平衡:在 length_of_element 之后没有匹配右括号的左括号。