2008-10-14 30 views
47

Tôi đã cố gắng giải thích sự khác biệt giữa báo cáo chuyển đổi và đối sánh mẫu (F #) với một vài người nhưng tôi thực sự không thể giải thích tốt ... hầu hết thời gian họ chỉ nhìn tôi và nói "vậy tại sao bạn không sử dụng nếu..then..else".Giải thích mẫu phù hợp vs chuyển đổi

Bạn sẽ giải thích cho họ bằng cách nào?

EDIT! Cảm ơn tất cả mọi người vì những câu trả lời tuyệt vời, tôi thực sự muốn tôi có thể đánh dấu nhiều câu trả lời đúng.

Trả lời

34

Trước đây từng là một trong những "người đó", tôi không biết rằng có một cách ngắn gọn để tổng hợp lý do tại sao sự phù hợp với khuôn mẫu là một sự ngon lành ngon lành như vậy. Đó là trải nghiệm.

Quay lại khi tôi vừa liếc nhìn mẫu phù hợp và nghĩ rằng đó là câu lệnh chuyển đổi được vinh hiển, tôi nghĩ rằng tôi không có kinh nghiệm lập trình với các loại dữ liệu đại số (tuples và phân biệt đối xử) và không thấy rõ khớp mẫu là cả cấu trúc điều khiển cấu trúc ràng buộc. Bây giờ tôi đã lập trình với F #, cuối cùng tôi đã "làm cho nó". Sự phù hợp của mô hình phù hợp là do sự hợp nhất các tính năng được tìm thấy trong các ngôn ngữ lập trình chức năng, và do đó, nó không tầm thường đối với người ngoài tìm kiếm để đánh giá cao.

Tôi đã cố tóm tắt một khía cạnh về lý do khớp mẫu hữu ích trong phần thứ hai của loạt bài blog ngắn gồm hai phần về ngôn ngữ và thiết kế API; hãy xem part onepart two.

+8

"trải nghiệm". Từ tốt. :-) –

-1

Có lẽ bạn có thể vẽ một sự tương tự với chuỗi và cụm từ thông dụng? Bạn mô tả những gì bạn đang tìm kiếm, và để cho trình biên dịch tìm ra số cách tự động. Nó làm cho mã của bạn đơn giản hơn và rõ ràng hơn.

Là một sang một bên: Tôi thấy rằng điều hữu ích nhất về khớp mẫu là nó khuyến khích thói quen tốt. Tôi xử lý các trường hợp góc đầu tiên và thật dễ dàng để kiểm tra xem tôi đã bao trả mọi trường hợp chưa.

5

Off đỉnh đầu của tôi:

  1. Trình biên dịch có thể nói nếu bạn chưa bao phủ tất cả các khả năng trong các trận đấu của bạn
  2. Bạn có thể sử dụng một trận đấu như một bài tập
  3. Nếu bạn có một công đoàn bị phân biệt đối xử, mỗi trận đấu có thể có một loại khác nhau 'loại'
28

Mẫu cung cấp cho bạn một ngôn ngữ nhỏ để mô tả cấu trúc của các giá trị bạn muốn khớp. Cấu trúc có thể tùy ý sâu và bạn có thể liên kết các biến với các phần của giá trị có cấu trúc.

Điều này cho phép bạn viết mọi thứ cực kỳ ngắn gọn. Bạn có thể minh họa điều này với một ví dụ nhỏ, chẳng hạn như một chức năng phái sinh cho một loại đơn giản các biểu thức toán học:

type expr = 
    | Int of int 
    | Var of string 
    | Add of expr * expr 
    | Mul of expr * expr;; 

let rec d(f, x) = 
    match f with 
    | Var y when x=y -> Int 1 
    | Int _ | Var _ -> Int 0 
    | Add(f, g) -> Add(d(f, x), d(g, x)) 
    | Mul(f, g) -> Add(Mul(f, d(g, x)), Mul(g, d(f, x)));; 

Thêm vào đó, vì kiểu kết hợp là một cấu trúc tĩnh với nhiều loại tĩnh, trình biên dịch có thể (i) xác minh rằng bạn bao phủ tất cả các trường hợp (ii) phát hiện các nhánh dư thừa không bao giờ có thể khớp với bất kỳ giá trị nào (iii) cung cấp việc thực hiện rất hiệu quả (với các bước nhảy, v.v.).

+0

Ví dụ hay. Khi giải thích mẫu phù hợp với "những người không có chức năng", tôi muốn đề cập rằng với PM, điều kiện của bạn có thể kiểm tra "hình dạng" dữ liệu của bạn, điều này khó hơn, xấu xí và không hiệu quả với if/switch. –

+0

'Thêm expr * expr' Tôi nghĩ bạn muốn viết' + ' –

+2

Không có lukas, đây là cú pháp trừu tượng, không phải cú pháp cụ thể, vì vậy' + 'không hợp lệ và' * 'không nên được hiểu là phép tính số học. 'Thêm expr * expr' khai báo một hàm tạo không liên tục' Thêm' có 2 đối số đều có kiểu 'expr'. Vì vậy, bạn sử dụng nó để xây dựng một sự kết hợp của 2 biểu thức được gắn nhãn là một 'Thêm'. –

4

Công tắc là hai bánh trước.

Khớp mẫu là toàn bộ ô tô.

+3

-1: Chuyển đổi chỉ là một bánh xe. –

13

Trích từ this blog article:

Pattern khớp có một số ưu điểm so với báo cáo công tắc và phương pháp công văn:

  • mẫu phù hợp có thể hành động theo ints, nổi, dây và các loại khác như cũng như các đối tượng.
  • Các đối sánh mẫu có thể hoạt động trên một số giá trị khác nhau đồng thời: đối sánh mẫu song song. Phương thức công văn và chuyển đổi được giới hạn ở một giá trị duy nhất, ví dụ: "điều này".
  • Mẫu có thể được lồng nhau, cho phép gửi qua các cây có độ sâu tùy ý . Phương thức gửi và chuyển đổi bị giới hạn đối với trường hợp không lồng nhau.
  • Hoặc các mẫu cho phép các mẫu con được chia sẻ . Chỉ gửi phương thức cho phép chia sẻ khi phương thức từ các lớp xảy ra để chia sẻ lớp cơ sở . Nếu không, bạn phải theo cách thủ công yếu tố phổ biến thành hàm riêng biệt (đặt tên ) và sau đó chèn thủ công các cuộc gọi từ tất cả các địa điểm thích hợp vào chức năng không cần thiết của bạn.
  • Kết hợp mẫu cung cấp dự phòng kiểm tra xem lỗi nào phát sinh lỗi.
  • Mẫu lồng nhau và/hoặc song song đối sánh được tối ưu hóa cho bạn bởi trình biên dịch F # F #. Tương đương OO phải được viết bằng tay và liên tục reoptimized bằng tay trong quá trình phát triển , bị cấm tẻ nhạt và dễ bị lỗi sao cho mã OO chất lượng sản xuất có xu hướng là .
  • Mẫu hoạt động cho phép bạn tiêm ngữ nghĩa tùy chỉnh của công văn.
3

Đối sánh mẫu trong OCaml, ngoài việc biểu cảm hơn như được đề cập trong một số cách đã được mô tả ở trên, cũng cung cấp một số đảm bảo tĩnh rất quan trọng. Trình biên dịch sẽ chứng minh cho bạn rằng trường hợp phân tích thể hiện bằng tuyên bố mô hình trận đấu của bạn là:

  • đầy đủ (không có trường hợp được bỏ qua)
  • không dự phòng (không có trường hợp mà không bao giờ có thể được nhấn bởi vì họ là Bị giành trước bởi một trường hợp trước)
  • âm thanh (không có mẫu mà là không thể đưa ra kiểu dữ liệu trong câu hỏi)

Đây là một thỏa thuận thực sự lớn. Sẽ rất hữu ích khi bạn viết chương trình lần đầu tiên và rất hữu ích khi chương trình của bạn đang phát triển. Được sử dụng đúng, các câu lệnh đối sánh giúp dễ dàng thay đổi các loại trong mã của bạn một cách đáng tin cậy, vì hệ thống kiểu chỉ cho bạn các câu lệnh đối sánh bị hỏng, đây là chỉ báo phong nha về nơi bạn có mã cần được sửa.

5

Tuples có "," và các biến thể có Ctor args ..đây là những người xây dựng, họ tạo ra mọi thứ.

Các mẫu là trình phá hủy, chúng tách chúng ra.

Chúng là các khái niệm kép.

Để đặt điều này một cách mạnh mẽ hơn: khái niệm về một bộ hoặc biến thể không thể được mô tả đơn thuần bởi hàm tạo của nó: hàm hủy là bắt buộc hoặc giá trị bạn tạo ra là vô dụng. Đây là những mô tả kép xác định một giá trị.

Nói chung chúng tôi nghĩ về các nhà xây dựng như dữ liệu và các trình phá hủy là luồng kiểm soát. Các destruct biến thể là các nhánh thay thế (một trong nhiều), các trình phá hủy tuple là các luồng song song (tất cả các chuỗi).

Các xử lý song song là điều hiển nhiên trong các hoạt động như

(f * g) . (h * k) = (f . h * g . k) 

nếu bạn nghĩ tầm kiểm soát chảy qua một chức năng, các bộ cung cấp một cách để chia tay một tính vào chủ đề song song tầm kiểm soát.

Nhìn vào cách này, biểu thức là cách để soạn các bộ dữ liệu và các biến thể để tạo cấu trúc dữ liệu phức tạp (suy nghĩ về AST).

Và đối sánh mẫu là cách để soạn các trình phá hủy (một lần nữa, hãy nghĩ đến AST).

0

Câu hỏi nếu khác (hoặc chuyển đổi) là về cách chọn các cách khác nhau để xử lý giá trị (đầu vào) tùy thuộc vào thuộc tính giá trị trong tầm tay.

So khớp mẫu là về cách xác định cách xử lý giá trị cho cấu trúc của nó (cũng lưu ý rằng mẫu chữ hoa đơn lẻ khớp với ý nghĩa). Do đó, mô hình phù hợp hơn là giải mã các giá trị hơn là lựa chọn, điều này làm cho chúng trở thành một cơ chế rất thuận tiện cho việc định nghĩa các hàm đệ quy trên các cấu trúc quy nạp (các loại liên kết đệ quy), giải thích tại sao chúng được sử dụng dồi dào trong các ngôn ngữ như Ocaml. v.v.

PS: Bạn có thể biết mẫu "khớp" và "Khác" từ việc sử dụng đặc biệt trong toán học;

"nếu x có tài sản A sau đó y khác z" (if-else)

"một số hạn trong p1..pn nơi .... là sự phân hủy thủ của x .." ((trường hợp đơn) khớp mẫu)

Các vấn đề liên quan