我想寫一個函數,它接受一個字符串並返回一個char列表。這是一個函數,但我認爲這不是我想做的(我想要一個字符串並返回一個字符列表)。字符串到字符列表
let rec string_to_char_list s =
match s with
| "" -> []
| n -> string_to_char_list n
我想寫一個函數,它接受一個字符串並返回一個char列表。這是一個函數,但我認爲這不是我想做的(我想要一個字符串並返回一個字符列表)。字符串到字符列表
let rec string_to_char_list s =
match s with
| "" -> []
| n -> string_to_char_list n
除了,但很重要:
你的代碼顯然是錯誤的,因爲你有一個遞歸調用的各個參數,你在得到了相同的一個準確這是要引起無限序列。的呼叫具有相同的值,從而永遠循環(堆棧溢出不會發生在尾錄位置)。
,你想要做將是什麼代碼:
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
或者,您也可以選擇使用圖書館:電池String.to_list或EXTLIB String.explode
Ni CE和簡單:
let rec list_car ch = match ch with
| "" -> []
| ch -> (String.get ch 0) :: (list_car (String.sub ch 1 ((String.length ch)-1))) ;;
怎麼是這樣的:
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;;
從有利的一面,這會爲空字符串工作!您需要更好地處理非空字符串。由於OCaml不允許使用模式匹配來解構字符串,因此像這樣的函數可能會使用索引(整數)來獲取字符串中的字符。 – 2012-04-09 03:58:44
'| n - > string_to_char_list n'這是一個無限循環。永遠不要用你得到的相同參數遞歸! – Ptival 2012-04-09 06:49:42