Biểu thức trường hợp

Một phần của tài liệu Tổng quan về ngôn ngữ lập trình haskell (Trang 36 - 37)

5. Biểu thức theo trường hợp và khớp mẫu

5.3.Biểu thức trường hợp

So khớp mẫu cung cấp một cách để “thực hiện điều khiển” (dispatch control) dựa vào thuộc tính cấu trúc của một giá trị. Trong nhiều hoàn cảnh, ta không muốn định nghĩa ra một hàm mỗi khi ta cần đến nó, nhưng tính đến nay, ta mới chỉ chỉ ra làm thế nào để so khớp mẫu trong những định nghĩa hàm. Biểu thức trường hợp của Haskell cung cấp một cách để giải quyết vấn đề này. Thực vậy, ngữ nghĩa của việc so khớp (partern matching) trong các định nghĩa hàm được đặc tả trong Report theo nghĩa là các biểu thức trường hợp, được xem là nguyên thủy hơn. Nói riêng, một định nghĩa hàm thường ở dạng:

f p11 … p1k = e1 …

f pn1 … pnk = en

trong đó mỗi pij là một mẫu, về ngữ nghĩa sẽ tương đương với :

Trong đó, các xi là các định danh mới. Chẳng hạn, định nghĩa take ở trước sẽ tương đương với:

(0,_) -> [] (_,[]) -> []

(n,x:xs) -> x : take (n-1) xs

Một điểm chưa được thực hiện trước đây là, đối với sự đúng đắn về kiểu, các kiểu của các vế phải của biểu thức trường hợp hoặc tập hợp các phương trình bao gồm các định nghĩa hàm phải giống nhau; chính xác hơn, chúng phải dùng chung một kiểu chính.

Các luật so khớp mẫu cho biểu thức trường hợp là giống nhau vì chúng ta đã đưa ra cho các định nghĩa hàm, do vậy không có gì mới để học ở đây cả, mà chẳng qua là chú ý đến sự thuận tiện mà biểu thức trường hợp mang lại. Thực vậy, việc sử dụng biểu thức trường hợp là khá phổ biến đến nỗi chúng ta có cú pháp : biểu thức điều kiện. Trong Haskell, biểu thức điều kiện có dạng quen thuộc :

if e1 then e2 else e3 là một dạng rút gọn của :

case e1 of true -> e2 false -> e3

Từ sự mở rộng này, rõ ràng rằng e1 phải có kiểu Bool, và e2, e3 phải có cùng kiểu (nhưng có thể tùy ý về kiểu), if-then-else nếu được xem xét dưới dạng hàm sẽ có kiểu là : bool->a-> a->a.

Một phần của tài liệu Tổng quan về ngôn ngữ lập trình haskell (Trang 36 - 37)