2012-04-09 37 views
14

Tôi muốn viết một hàm lấy chuỗi và trả về danh sách char. Đây là một chức năng, nhưng tôi nghĩ rằng nó không làm những gì tôi muốn (tôi muốn lấy một chuỗi và trả về một danh sách các ký tự).chuỗi vào danh sách char

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

Về phía cộng, điều này sẽ làm việc cho một chuỗi rỗng! Bạn cần phải xử lý các chuỗi không trống một chút tốt hơn. Vì OCaml không cho phép bạn hủy cấu trúc một chuỗi có khớp mẫu, một hàm như thế này có lẽ sẽ sử dụng một chỉ mục (một số nguyên) để lấy các ký tự trong chuỗi. –

+2

'| n -> string_to_char_list n' đó là một vòng lặp vô hạn cho bạn. Không bao giờ tái chế với cùng thông số mà bạn đã tham gia! – Ptival

Trả lời

25

Bên cạnh, nhưng rất quan trọng:

Mã của bạn là rõ ràng là sai bởi vì bạn có một cuộc gọi đệ quy mà tất cả các thông số là một trong những chính xác mà bạn nhận được trong Nó sẽ tạo ra một chuỗi vô hạn. của các cuộc gọi với các giá trị tương tự trong, do đó looping mãi mãi (một tràn ngăn xếp sẽ không xảy ra ở vị trí đuôi-rec).


Mã mà những gì bạn muốn sẽ là:

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) [] 

Nguồn: http://caml.inria.fr/pub/old_caml_site/FAQ/FAQ_EXPERT-eng.html#strings


Ngoài ra, bạn có thể chọn để sử dụng một thư viện: pin String.to_list hoặc extlib String.explode

5

Ni ce và đơn giản:

let rec list_car ch = match ch with 
    | "" -> [] 
    | ch -> (String.get ch 0) :: (list_car (String.sub ch 1 ((String.length ch)-1))) ;; 
1

Làm thế nào về một cái gì đó như thế này:

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;; 
Các vấn đề liên quan