2012-04-09 19 views
14

文字列を取り、charのリストを返す関数を記述したいと思います。ここに関数がありますが、私はそれが私が望むことではないと思う(文字列をとり、文字のリストを返す)。文字列のリスト

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

プラス側では、これは空の文字列のために動作します!空でない文字列を少しだけ処理する必要があります。 OCamlはパターンマッチングで文字列を構造化することはできないので、このような関数はおそらく文字列の文字を取得するためにインデックス(整数)を使用します。 –

+2

'| n - > string_to_char_list n'これは無限ループです。あなたが持っているのと同じパラメータで再帰しないでください! – Ptival

答えて

25
別に

が、非常に重要:あなたは、すべてのパラメータは、あなたがに入った正確に同じ1であるため、再帰呼び出しを持っているので、

あなたのコードは明らかに間違っている無限のシーケンスを誘導しようとしています。の値を持つ呼び出しを永久にループします(スタックオーバーフローはtail-recの位置では起こりません)。


あなたが欲しいものを行うコードは次のようになります。

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;; 
関連する問題