函数表示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 之后没有匹配右括号的左括号。
我想知道 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 之后没有匹配右括号的左括号。