Có những câu trả lời hay khác, vì vậy tôi sẽ cung cấp cho bạn câu trả lời rất kỹ thuật. Mô hình kết hợp việc loại bỏ xây dựng cho kiểu dữ liệu đại số:
"Xoá bỏ xây dựng" có nghĩa là "làm thế nào để tiêu thụ hoặc sử dụng một giá trị"
"đại số kiểu dữ liệu", ngoài các hàm hạng nhất, là ý tưởng lớn trong một ngôn ngữ chức năng được gõ tĩnh như Clean, F #, Haskell, hoặc ML
Ý tưởng về các kiểu dữ liệu đại số là rằng bạn định nghĩa một loại điều, và bạn nói tất cả các cách bạn có thể làm điều đó. Như một ví dụ, chúng ta hãy định nghĩa "Chuỗi các String" như một kiểu dữ liệu đại số, với ba cách để làm cho nó:
data StringSeq = Empty -- the empty sequence
| Cat StringSeq StringSeq -- two sequences in succession
| Single String -- a sequence holding a single element
Giờ đây, có tất cả các loại điều sai trái với định nghĩa này, nhưng là một ví dụ thật thú vị bởi vì nó cung cấp liên tục thời gian của chuỗi các chiều dài tùy ý. (Có nhiều cách khác để đạt được điều này.) Tuyên bố giới thiệu Empty
, Cat
và Single
, tất cả các cách có tạo trình tự. (Điều đó làm cho mỗi người một giới thiệu xây dựng — một cách để làm cho mọi việc.)
- Bạn có thể thực hiện một chuỗi rỗng mà không cần bất kỳ giá trị khác.
- Để tạo chuỗi với
Cat
, bạn cần hai trình tự khác.
- Để thực hiện một chuỗi với
Single
, bạn cần một yếu tố (trong trường hợp này một chuỗi)
Ở đây có những điểm mấu chốt: các cấu trúc loại bỏ, mô hình phù hợp, mang lại cho bạn một cách để rà soát một chuỗi và yêu cầu đó là câu hỏi bạn đã tạo ra hàm tạo nào?. Bởi vì bạn phải chuẩn bị cho bất kỳ câu trả lời nào, bạn cung cấp ít nhất một giải pháp thay thế cho mỗi hàm tạo. Dưới đây là một chức năng chiều dài:
slen :: StringSeq -> Int
slen s = case s of Empty -> 0
Cat s s' -> slen s + slen s'
Single _ -> 1
Tại cốt lõi của ngôn ngữ, tất cả các mô hình phù hợp được xây dựng trên case
cấu trúc này. Tuy nhiên, do kiểu dữ liệu đại số và mô hình kết hợp rất quan trọng đối với thành ngữ của ngôn ngữ, có đặc biệt "cú pháp đường" để thực hiện mô hình kết hợp trong tờ khai của một định nghĩa hàm:
slen Empty = 0
slen (Cat s s') = slen s + slen s'
slen (Single _) = 1
Với đường cú pháp này, tính toán bằng cách khớp mẫu trông giống như định nghĩa bằng phương trình. (Ủy ban Haskell đã làm điều này có chủ đích.) Và như bạn có thể thấy trong các câu trả lời khác, có thể chuyên hoặc là một phương trình hoặc một thay thế trong một biểu thức case
bằng cách tát một bảo vệ trên đó. Tôi không thể nghĩ ra một người bảo vệ hợp lý cho ví dụ trình tự, và có rất nhiều ví dụ trong các câu trả lời khác, vì vậy tôi sẽ để nó ở đó.
Có lẽ cũng nên bao gồm khái niệm đối sánh mẫu trong F # ... –
Hàng nghìn ngôn ngữ có mẫu khớp, không chỉ Haskell và F #. – Joe
Đó là một tính năng phổ biến của các ngôn ngữ có chức năng thuần túy và hạn chế. Ví dụ: Prolog, Erlang và SML. – outis