Строка в список char
Я хочу написать функцию, которая берет строку и возвращает список char. Вот функция, но я думаю, что она не делает то, что я хочу (я хочу взять строку и вернуть список символов).
let rec string_to_char_list s =
match s with
| "" -> []
| n -> string_to_char_list n
Ответы
Ответ 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;;