Thứ tự các thông số để sử dụng cà ri


93

Gần đây, tôi đã cấu trúc lại mã hai lần để thay đổi thứ tự của các thông số vì có quá nhiều mã nơi các vụ hack như fliphoặc \x -> foo bar x 42đang xảy ra.

Khi thiết kế một chữ ký chức năng, những nguyên tắc nào sẽ giúp tôi sử dụng tốt nhất các riềm?

Câu trả lời:


111

Đối với các ngôn ngữ hỗ trợ việc lập trình và áp dụng một phần dễ dàng, có một loạt lập luận hấp dẫn, ban đầu từ Chris Okasaki:

  • Đặt cấu trúc dữ liệu làm đối số cuối cùng

Tại sao? Sau đó, bạn có thể soạn các thao tác trên dữ liệu một cách độc đáo. Vd insert 1 $ insert 2 $ insert 3 $ s. Điều này cũng giúp ích cho các chức năng trên trạng thái .

Các thư viện tiêu chuẩn như "vùng chứa" tuân theo quy ước này .

Các đối số thay thế đôi khi được đưa ra để đặt cấu trúc dữ liệu trước, vì vậy nó có thể được đóng lại, tạo ra các hàm trên cấu trúc tĩnh (ví dụ: tra cứu) ngắn gọn hơn một chút. Tuy nhiên, sự đồng thuận rộng rãi dường như là điều này ít mang lại chiến thắng, đặc biệt là vì nó đẩy bạn tới mã có dấu ngoặc đơn nặng.

  • Đặt đối số khác nhau nhất cuối cùng

Đối với các hàm đệ quy, người ta thường đặt đối số thay đổi nhiều nhất (ví dụ một bộ tích lũy) làm đối số cuối cùng, trong khi đối số thay đổi ít nhất (ví dụ một đối số hàm) ở đầu. Điều này kết hợp tốt với kiểu cuối cùng của cấu trúc dữ liệu.


Bản tóm tắt của khung nhìn Okasaki được đưa ra trong thư viện Edison của anh ấy (một lần nữa, một thư viện cấu trúc dữ liệu khác):

  • Áp dụng một phần : các đối số có nhiều khả năng là tĩnh thường xuất hiện trước các đối số khác để tạo điều kiện cho việc áp dụng một phần.
  • Bộ sưu tập xuất hiện cuối cùng : trong tất cả các trường hợp một thao tác truy vấn một tập hợp đơn lẻ hoặc sửa đổi một tập hợp hiện có, đối số tập hợp sẽ xuất hiện sau cùng. Đây là một tiêu chuẩn thực tế cho các thư viện cơ cấu dữ liệu Haskell và tạo ra một mức độ nhất quán cho API.
  • Thứ tự thông thường nhất : trong đó một phép toán đại diện cho một hàm toán học nổi tiếng trên nhiều cơ cấu dữ liệu, các đối số được chọn để khớp với thứ tự đối số thông thường nhất cho hàm.

Như một hệ quả của gạch đầu dòng đầu tiên, hãy đặt đối số có thể tồn tại trong cấu trúc dữ liệu sau cùng. Nó làm cho bản đồ, nếp gấp và bạn bè sạch sẽ hơn. tl; dr thứ trong danh sách đi sau cùng.
John F. Miller

1
Tra cứu không thể được xâu chuỗi bất cứ lúc nào, vì vậy điểm đầu tiên không hỗ trợ điều đó sang một bên. haskell.org/haskellwiki/Parameter_order đưa ra một đối số cogent theo cách ngược lại - "Vì các đối tượng kiểu Bản đồ đại diện cho các ánh xạ, nên điều tự nhiên là có một số hàm biến đổi một đối tượng Bản đồ thành hàm được biểu diễn."
Brandon

11

Đặt các đối số mà bạn có nhiều khả năng sẽ sử dụng lại trước. Đối số hàm là một ví dụ tuyệt vời về điều này. Bạn có nhiều khả năng muốn map fhơn hai danh sách khác nhau, hơn là bạn muốn ánh xạ nhiều chức năng khác nhau trên cùng một danh sách.


5
Nếu trên thực tế, bạn đang ánh xạ nhiều hàm trên cùng một danh sách, có lẽ bạn nên tạo một danh sách các hàm và map ($myList)thay vào đó trong danh sách đó.
Squidly

3

Tôi có xu hướng làm những gì bạn đã làm, chọn một số đơn đặt hàng có vẻ tốt và sau đó cấu trúc lại nếu nó cho ra rằng một đơn đặt hàng khác tốt hơn. Thứ tự phụ thuộc rất nhiều vào cách bạn sẽ sử dụng chức năng (tự nhiên).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.