2012-01-21 40 views
8

Tôi mới ở OCaml (và vẫn là một người mới trong lập trình học nói chung) và tôi có một câu hỏi nhanh về việc kiểm tra loại chuỗi phần tử tiếp theo trong danh sách chuỗi là gì.Làm thế nào để kiểm tra trong 'đầu' tiếp theo trong OCaml là sản phẩm nào?

Tôi muốn nó đặt dấu phân tách giữa mỗi phần tử của chuỗi (ngoại trừ cái cuối cùng), nhưng tôi không thể tìm ra cách làm cho chương trình 'biết' rằng phần tử cuối cùng là phần tử cuối cùng.

Đây là mã của tôi như bây giờ:

let rec join (separator: string) (l : string list) : string = 
begin match l with 
    | []->"" 
    | head::head2::list-> if head2=[] then head^(join separator list) else head^separator^(join separator list) 
end 


let test() : bool = 
(join "," ["a";"b";"c"]) = "a,b,c" 
;; run_test "test_join1" test 

Cảm ơn trước!

Trả lời

9

Bạn sắp hoàn tất. Ý tưởng là chia nhỏ danh sách trong ba trường hợp trong đó nó có 0, 1 hoặc ít nhất 2 phần tử. Khi danh sách có nhiều hơn một phần tử, bạn đang an toàn để chèn separator vào chuỗi đầu ra:

let rec join (separator: string) (l : string list) : string = 
    begin match l with 
    | [] -> "" 
    | head::[] -> head 
    | head::list-> head^separator^(join separator list) 
    end 

Tôi có một vài ý kiến ​​về chức năng của bạn:

  • Loại chú thích là không cần thiết. Vì (^) là toán tử nối chuỗi, trình kiểm tra loại có thể suy ra các loại separator, l và đầu ra của hàm một cách dễ dàng.
  • Không cần sử dụng cặp begin/and. Vì bạn chỉ có một mức phù hợp với mẫu, nên không có sự nhầm lẫn nào với trình biên dịch.
  • Bạn có thể sử dụng function để loại bỏ match l with một phần.

Do đó, mã của bạn có thể được rút ngắn như:

let rec join sep l = 
    match l with 
    | [] -> "" 
    | x::[] -> x 
    | x::xs -> x^sep^join sep xs 

hoặc thậm chí ngắn gọn hơn:

let rec join sep = function 
    | [] -> "" 
    | x::[] -> x 
    | x::xs -> x^sep^join sep xs 
7

Danh sách rỗng là [], danh sách với một phần tử là [h] và danh sách với ít nhất một phần tử là h::t. Vì vậy, chức năng của bạn có thể được viết là:

let rec join separator = function 
    | [] -> "" 
    | [h] -> h 
    | h::t -> h^separator^join separator t 
Các vấn đề liên quan