Подтвердить что ты не робот

Строка в список char

Я хочу написать функцию, которая берет строку и возвращает список char. Вот функция, но я думаю, что она не делает то, что я хочу (я хочу взять строку и вернуть список символов).

let rec string_to_char_list s =
    match s with
      | "" -> []
      | n -> string_to_char_list n
4b9b3361

Ответ 1

Помимо, но очень важно:

Ваш код, очевидно, неверен, потому что у вас есть рекурсивный вызов, для которого все параметры точно такие же, как у вас. Он будет вызывать бесконечную последовательность вызовов с одинаковыми значениями, таким образом, цикл будет длиться вечно (выиграно переполнение стека) это может произойти в заднем положении).


Код, который делает то, что вы хотите, будет:

let explode s =
  let rec exp i l =
    if i < 0 then l else exp (i - 1) (s.[i] :: l) in
  exp (String.length s - 1) []

Источник: http://caml.inria.fr/pub/old_caml_site/FAQ/FAQ_EXPERT-eng.html#strings


В качестве альтернативы вы можете использовать библиотеку: battery String.to_list или extlib String.explode

Ответ 2

Приятный и простой:

let rec list_car ch = match ch with
    | "" -> []
    | ch -> (String.get ch 0 ) :: (list_car (String.sub ch 1 ( (String.length ch)-1) ) )  ;;

Ответ 3

Попробуй это:

let explode s = List.init (String.length s) (String.get s)

Ответ 4

Как насчет чего-то вроде этого:

let string_to_list str =
  let rec loop i limit =
    if i = limit then []
    else (String.get str i) :: (loop (i + 1) limit)
  in
  loop 0 (String.length str);;

let list_to_string s =
  let rec loop s n =
    match s with
      [] -> String.make n '?'
    | car :: cdr ->
       let result = loop cdr (n + 1) in
       String.set result n car;
       result
  in
  loop s 0;;

Ответ 5

Вот итерационная версия для получения списка символов из строки:

let string_to_list s = 
let l = ref [] in
for i = 0 to String.length s - 1 do
    l := (!l) @ [s.[i]]
done;
!l;;