2012-04-09 113 views
14

我想寫一個函數,它接受一個字符串並返回一個char列表。這是一個函數,但我認爲這不是我想做的(我想要一個字符串並返回一個字符列表)。字符串到字符列表

let rec string_to_char_list s = 
    match s with 
     | "" -> [] 
     | n -> string_to_char_list n 
+0

從有利的一面,這會爲空字符串工作!您需要更好地處理非空字符串。由於OCaml不允許使用模式匹配來解構字符串,因此像這樣的函數可能會使用索引(整數)來獲取字符串中的字符。 – 2012-04-09 03:58:44

+2

'| n - > string_to_char_list n'這是一個無限循環。永遠不要用你得到的相同參數遞歸! – Ptival 2012-04-09 06:49:42

回答

25

除了,但很重要:

你的代碼顯然是錯誤的,因爲你有一個遞歸調用的各個參數,你在得到了相同的一個準確這是要引起無限序列。的呼叫具有相同的值,從而永遠循環(堆棧溢出不會發生在尾錄位置)。


,你想要做將是什麼代碼:

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

5

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))) ;; 
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;; 
相關問題