22

文字列を取り、charのリストを返す関数を書きたいです。これは関数ですが、私が望むことをしていないと思います(文字列を取得して文字のリストを返したい)。

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

6 に答える 6

31

余談ですが、非常に重要です。

すべてのパラメータが入力したものとまったく同じである再帰呼び出しがあるため、コードは明らかに間違っています。同じ値を持つ呼び出しの無限のシーケンスが誘発されるため、永久にループします(スタックオーバーフローは発生しません) tはテールレック位置で発生します)。


あなたが望むことをするコードは次のようになります:

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


または、ライブラリを使用することもできます:batterysString.to_listまたはextlibString.explode

于 2012-04-09T06:56:16.267 に答える
21

これを試して:

let explode s = List.init (String.length s) (String.get s)
于 2018-09-18T18:49:50.177 に答える
5

素晴らしくてシンプル:

let rec list_car ch = match ch with
    | "" -> []
    | ch -> (String.get ch 0 ) :: (list_car (String.sub ch 1 ( (String.length ch)-1) ) )  ;;
于 2014-06-12T00:03:17.250 に答える
3

このようなものはどうですか:

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;;
于 2015-08-10T21:47:12.320 に答える
1

文字列からcharリストを取得するための反復バージョンは次のとおりです。

let string_to_list s = 
let l = ref [] in
for i = 0 to String.length s - 1 do
    l := (!l) @ [s.[i]]
done;
!l;;
于 2018-12-18T11:01:25.310 に答える
1

私のコード、現代のOCamlに適しています:

let charlist_of_string s =
  let rec trav l i =
    if i = l then [] else s.[i]::trav l (i+1)
  in
  trav (String.length s) 0;;

let rec string_of_charlist l =
  match l with
    [] -> "" |
    h::t -> String.make 1 h ^ string_of_charlist t;;
于 2020-09-28T15:09:41.020 に答える