Ngữ nghĩa của khớp mẫu

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

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

5.1.Ngữ nghĩa của khớp mẫu

Trước đây, chúng ta đã đề cập đến việc làm thế nào một mẫu riêng lẻ được so khớp, làm sao một số có thể bác bỏ được, làm sao một số khác lại không…Nhưng cái gì điều khiển tất cả các quá trình đó. Thứ tự so khớp là gì. Điều gì xảy ra nếu không có mẫu nào được so khớp. Phần này sẽ trình bày về những vấn đề đó.

Việc khớp mẫu có thể thành công, thất bại hoặc có thể bị phân kì (deverge). So khớp thành công gắn kết các tham số hình thức vào trong mẫu. Sự phân kì xuất hiện khi một giá trị cần thiết bởi mẫu chứa lỗi trong đó (⊥). Quá trình so khớp diễn ra “từ trên xuống, trái qua phải”. Sự thất bại của một mẫu ở bất kì vị trí nào trong phương trình sẽ dẫn đến sự thất bại trong toàn bộ phương trình, và phương

trình kế tiếp sẽ được thử so khớp. Nếu tất cả các phương trình đều thất bại, giá trị của hàm ứng dụng (function application) là ⊥, dẫn đến lỗi runtime.

Chẳng hạn, nếu [1, 2] được đem so khớp với [0, bot], khi đó 1 so khớp thất bại với 0, do đó dẫn đến kết quả là so khớp thất bại. (Nhớ lại rằng, bot, như được định nghĩa ở trước, là giá trị được ràng buộc với ⊥ ). Nhưng nếu [1, 2] được đem so khớp với [bot, 0], khi đó sự so khớp 1 với bot dẫn đến một sự phân kì. (nghĩa là

⊥).

Vấn đề khó khăn đối với tập luật ở chỗ các mẫu ở mức đỉnh có thể có một giá trị boolean đảm bảo, như định nghĩa sau đây của một hàm, trong đó tạo ra một phiên bản trừu tượng của dấu của một số:

sign x | x > 0 = 1 | x == 0 = 0 | x < 0 = -1

Chú ý rằng, một dãy các đảm bảo có cung cấp cho cùng một mẫu; cũng giống như mẫu, chúng được đánh giá từ trên xuống, cái đầu tiên được đánh giá True cho kết quả so khớp thành công.

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