Функция, возвращающая кортеж (length_of_element, element) - PullRequest
0 голосов
/ 25 мая 2020

Я хотел знать, есть ли в OCAML способ вернуть длину строкового элемента списка строк и самого элемента? Я хочу сделать что-то вроде этого:

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

, и я хочу, чтобы ключевое слово in передавалось в следующую часть кода, length_of_element, которая является длиной элемента. «Hello» (если мы находимся на l oop 0) и сам элемент, который является «Hello» (если мы на l oop 0)

UPDATE

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 ) - это мой список.

Я пытался реализовать то, что Гийом Мелкионд сказал мне в своем ответе, но я получить эту ошибку:

Ошибка: синтаксическая ошибка: ожидается оператор.

(Ошибка указывает на эту строку:

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

Кто-нибудь будет откуда возникла эта ошибка?

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

0 голосов
/ 26 мая 2020

Второй вопрос.

(В идеале вы должны задавать один вопрос для каждого сообщения StackOverflow.)

Ваш извлеченный текст имеет 3 правые скобки и только 1 левую скобку. Это может быть связано с синтаксической ошибкой.

0 голосов
/ 26 мая 2020

Самый простой способ, который я могу себе представить, будет следующим:

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

, который возвращает:

- : (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.

0 голосов
/ 25 мая 2020

Выполнение внешних итераций в 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.

...