Phạm vi từ vựng và các dạng lồng nhau

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

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

5.5.Phạm vi từ vựng và các dạng lồng nhau

Trong một biểu thức, chúng ta thường tạo các phạm vi lồng nhau, để tạo ra các ràng buộc địa phương được che giấu đối với các nơi khác – nghĩa là một vài dạng của “cấu trúc khối”. Trong Haskell, có hai cách để đạt được điều này:

Các biểu thức Let: Biểu thức Let trong Haskell rất hữu ích bất cứ lúc nào cần thiết tới tập các liên kết (binding) lồng nhau. Ta hãy xem một ví dụ đơn giản dưới đây.

let y = a*b

f x = (x+y)/y in f c + f d

Tập các liên kết được tạo ra bằng biểu thức let đệ qui qua lại , và các liên kết mẫu được đối xử như là các mẫu Lazy (nghĩa là ngầm định có ~). Các loại khai báo được phép là : type signatures, function bindings, và pattern bindings.

Mệnh đề Where : Thỉnh thoảng, ta cần các liên kết lồng nhau trong đó có một số điều kiện, lúc đó chúng ta cần đến mệnh đề where

f x y | y>z = ... | y==z = ... | y<z = ... where z = x*x

Chú ý rằng điều này không thể làm được với biểu thức let. Một mệnh đề where chỉ được phép khi ở mức đỉnh của một tập các phương trình hoặc biểu thức trường hợp. Các thuộc tính và ràng buộc tương tự đối với các liên kết trong biểu thức let

Hai kiểu lồng phạm vi dường như giống nhau, nhưng chúng ta hãy nhớ rằng biểu thức let là một biểu thức, trong khi mệnh đề where thì không phải – nó là một phần của cú pháp của khai báo hàm và biểu thức trường hợp.

5.6.Trình bày

Người đọc có phân vân rằng làm sao các chương trình Haskell có thể tránh được việc dùng các dấu chấm phẩy, hoặc một dạng nào khác của dấu kết thúc, để dánh dấu sự kết thúc của một phương trình, khai báo, …Chẳng hạn, chúng ta xem xét lại ví dụ biểu thức let trong phần trước.

let y = a*b

f x = (x+y)/y in f c + f d

Làm sao để bộ phân tích biết để không phân tích thành

let y = a*b f x = (x+y)/y in f c + f d

Câu trả lời là Haskell sử dụng cú pháp 2 chiều gọi là “layout” mà chủ yếu dựa trên khai báo được “gióng hàng theo cột” (lined up in column). Trong ví dụ trên, chú ý rằng y và f nằm trên cùng một cột. Để có thể trình bày theo luật, chúng ta cần nhớ 2 điều sau:

Thứ nhất, kí tự tiếp theo theo sau bất kì một từ khóa trong các từ khóa where, let, of là những thứ quyết định bắt đầu một cột để khai báo trong các mệnh đề where, let, hoặc các biểu thức trường hợp.

Thứ hai, chỉ cần chắc chắn rằng cột bắt đầu là xa phía phải hơn cột bắt đầu của mệnh đề bao nó (nếu không nó sẽ bị nhầm lẫn).

Việc trình bày thực tế là một cơ chế tường minh của phân nhóm, xứng đáng để đề cập đến vì nó hữu ích trong một số trường hợp. Biểu thức let ở trên có thể tương đương với:

let {y = a*b

;f x = (x+y)/y }

in f c + f d

Chú ý chúng ta có các ngoặc nhọn và dấu chấm phẩy. Cách này sử dụng các dấu tường minh đôi lúc hữu dụng trong trường hợp có nhiều khai báo trên một dòng, chẳng hạn khai báo như sau là hợp lệ:

let y = a*b; z = a/b f x = (x+y)/z in f c + f d

Việc sử dụng trình bày (layout) làm giảm đáng kể sự rườm rà của cú pháp tương ứng với các khai báo danh sách, do đó tăng tính sáng sủa.

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