2011-12-23 25 views
16

Trong Haskell, tôi thường viết các biểu thức với $ 's. Tôi thấy nó khá tự nhiên và dễ đọc, nhưng đôi khi tôi đọc nó là hình thức xấu và không hiểu tại sao nó phải như thế.

+7

Bạn có tham chiếu về vị trí được mô tả dưới dạng không hợp lệ không? – bobbymcr

+0

Câu trả lời ngắn gọn: không. –

Trả lời

22

Sau đây là tất cả các hình thức tốt:

foo = bar . baz . quux 
foo x = bar . baz . quux $ x 
foo x = (bar . baz . quux) x 
foo x = bar (baz (quux x)) 

Tôi đã đặt chúng theo thứ tự sơ bộ sở thích của tôi, mặc dù như mọi khi nếm khác nhau, và bối cảnh có thể yêu cầu một sự lựa chọn khác nhau. Tôi cũng đã thỉnh thoảng nhìn thấy

foo = bar 
    . baz 
    . quux 

khi mỗi bar, baz, và quux subexpressions dài. Sau đây là hình thức xấu:

foo x = bar $ baz $ quux $ x 

Có hai lý do khiến việc này ít thích hợp hơn. Đầu tiên, có thể sao chép và dán các biểu thức con nhỏ hơn vào một định nghĩa phụ trong quá trình tái cấu trúc; với tất cả các toán tử ($), chỉ các biểu thức phụ bao gồm đối số x là các phép tái cấu trúc hợp lệ, trong khi các toán tử (.)($) thậm chí là các biểu thức con như bar . baz hoặc baz . quux có thể được tách ra thành định nghĩa riêng.

Lý do thứ hai để thích (.) được dự đoán là có thể thay đổi về độ cố định của ($); hiện nay, ($)infixr, có nghĩa là nó liên kết ở bên phải, như vậy:

foo x = bar $ (baz $ (quux $ x)) 

Tuy nhiên, ($) sẽ có ích trong các biểu thức hơn nếu nó là infixl; ví dụ: một cái gì đó như

foo h = f (g x) (h y) 
foo h = f $ g x $ h y 
foo h = (f $ g x) $ h y 

... hiện không thể được thể hiện mà không có dấu ngoặc đơn. Ví dụ "hình thức xấu", khi được phân tích cú pháp bằng ứng dụng infixl, sẽ là

foo x = ((bar $ baz) $ quux) $ x 

có nghĩa là có sự khác biệt đáng kể. Vì vậy, trong tương lai bằng chứng mã của bạn bằng cách tránh hình thức này.

+6

Tôi cũng thỉnh thoảng thấy những thứ như 'bar. baz $ quux x' hoặc 'bar (baz. quux $ x)' hoặc các hỗn hợp khác, thường là khi các toán tử infix khác tham gia, hoặc khi các ứng dụng chức năng cụ thể đang được nhấn mạnh một cách khái niệm. –

+6

IMO, đối số cố định kém hấp dẫn hơn so với thực tế là kiểu tổng hợp cho phép bạn cấu trúc lại đường ống vào một hàm với thao tác cắt và dán đơn giản. – ehird

+0

Với tính cố định hiện tại, nếu bạn có 'bar $ baz $ quux $ x', điều này tương đương với' bar. baz. quux $ x'. Sau này, tất nhiên, được khuyến khích trước đây. –

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