Thư viện Haskell Lens gây tranh cãi gay gắt về độ phức tạp của toán tử so với khả năng đọc hiểu

Nhóm Cộng đồng BigGo
Thư viện Haskell Lens gây tranh cãi gay gắt về độ phức tạp của toán tử so với khả năng đọc hiểu

Cộng đồng lập trình Haskell đang tham gia vào một cuộc thảo luận sôi nổi về cách tiếp cận lập trình hàm của thư viện lens, đặc biệt xoay quanh việc liệu bộ sưu tập toán tử ký hiệu phong phú của nó có giúp ích hay cản trở khả năng đọc hiểu mã nguồn. Cuộc tranh luận này xuất hiện từ các cuộc trò chuyện đang diễn ra về việc làm cho lập trình hàm trở nên dễ tiếp cận hơn với các nhà phát triển chính thống.

Sự phân chia lớn về toán tử

Sự căng thẳng trung tâm xoay quanh các toán tử lens như ^., ^.., ^?, và những toán tử kỳ lạ hơn như <<|>~. Một phe cho rằng những ký hiệu này tạo ra sự phức tạp không cần thiết, giống như tiếng ồn trên đường truyền buộc các nhà phát triển phải ghi nhớ hàng chục toán tử khó hiểu. Họ ủng hộ việc loại bỏ hoàn toàn các toán tử để thay thế bằng những tên hàm rõ ràng như toListOf, điều này ngay lập tức truyền đạt được mục đích của nó.

Quan điểm đối lập ủng hộ những toán tử này như một ngôn ngữ mini được thiết kế cẩn thận giúp giảm gánh nặng tinh thần một khi đã học. Những người ủng hộ chỉ ra rằng các toán tử tuân theo các mẫu nhất quán - ^. cho kết quả đơn, ^.. cho nhiều kết quả, và ^? cho kết quả tùy chọn. Họ lập luận rằng hệ thống này loại bỏ nhu cầu về các dấu ngoặc đơn phức tạp và tạo ra mã nguồn dễ đọc hơn thông qua việc quét trực quan thay vì quản lý ngăn xếp tinh thần.

Lưu ý: Các toán tử Lens là những hàm ký hiệu cung cấp các cách ngắn gọn để truy cập và sửa đổi cấu trúc dữ liệu trong lập trình hàm.

Các Toán Tử Lens Phổ Biến và Chức Năng Của Chúng

Toán Tử Mục Đích Ví Dụ Sử Dụng
^. Lấy kết quả đơn (view) "hello" ^. ix 1 trả về 'e'
^.. Lấy nhiều kết quả [1..5] ^. filtered even trả về [2,4]
^? Lấy kết quả tùy chọn "hello" ^? ix 4 trả về Just 'o'
.~ Thiết lập giá trị "hello" &amp; ix 1 .~ 'E' trả về "hEllo"
%~ Sửa đổi giá trị Được sử dụng để áp dụng các hàm nhằm sửa đổi giá trị
^@.. Lấy nhiều kết quả cùng với chỉ số Trả về kết quả cùng với vị trí của chúng

Đường cong học tập so với lợi ích dài hạn

Cuộc thảo luận tiết lộ một sự đánh đổi cơ bản giữa khó khăn học tập ban đầu và năng suất dài hạn. Những người chỉ trích nhấn mạnh rằng các quy tắc ưu tiên toán tử tạo ra hành vi ngầm định khó nhớ ngoài phép toán cơ bản. Họ thích dấu ngoặc đơn rõ ràng và định dạng nhiều dòng để hướng dẫn hiểu biết.

Những người bảo vệ phản bác rằng hệ thống kiểu của Haskell làm cho ưu tiên ít quan trọng hơn vì hầu hết các biểu thức chỉ kiểm tra kiểu với một cách diễn giải hợp lệ. Điều này cho phép các nhà phát triển tin tưởng vào trình biên dịch thay vì ghi nhớ các quy tắc phức tạp.

Các cách tiếp cận thay thế thu hút sự chú ý

Các thành viên cộng đồng đã làm nổi bật những triển khai dễ tiếp cận hơn trong các ngôn ngữ khác. Thư viện Arrow của Kotlin và gói Accessors.jl của Julia cung cấp chức năng tương tự với cú pháp cảm thấy quen thuộc hơn với các nhà phát triển chính thống. Cách tiếp cận của PureScript với ứng dụng kiểu hiển thị cho phép các cấu trúc như foo ^. ln@bar <<< ln@baz tạo cầu nối giữa tính ngắn gọn ký hiệu và khả năng đọc hiểu.

Một số thành viên khuyến nghị bắt đầu với những cuốn sách như Optics by Example thay vì đi thẳng vào tài liệu thư viện lens, gợi ý rằng tài liệu chính thức có thể không phải là điểm khởi đầu tốt nhất cho người mới.

Thư viện Lens thay thế theo ngôn ngữ lập trình

  • Kotlin: Thư viện Arrow - Cú pháp dễ đọc hơn, quen thuộc với các lập trình viên phổ thông
  • Julia: Accessors.jl - Được mô tả là dễ hiểu hơn so với phiên bản Haskell
  • PureScript: Hỗ trợ lens tự nhiên với khả năng áp dụng kiểu hiển thị
  • Clojure: Thư viện Specter - Chức năng tương tự nhưng với triết lý khác biệt
  • JavaScript: Monocle-ts - Cung cấp các khái niệm lens cho các lập trình viên TypeScript/JavaScript

Câu hỏi rộng hơn về khả năng tiếp cận

Cuộc tranh luận này phản ánh những câu hỏi lớn hơn về việc áp dụng lập trình hàm. Trong khi những người đam mê Haskell ca ngợi sự thanh lịch toán học và các trừu tượng mạnh mẽ của ngôn ngữ, những người chỉ trích lập luận rằng việc ưu tiên tính thuần khiết lý thuyết hơn tính tiện dụng tạo ra những rào cản không cần thiết cho các nhà phát triển đang làm việc.

Có ít dấu ngoặc đơn hơn không phải là một chiến thắng, nó làm cho nhiều thứ trở nên ngầm định hơn và buộc mọi người phải nhớ ưu tiên toán tử.

Cuộc thảo luận đã khơi dậy các đề xuất cho các giải pháp công cụ, bao gồm các tính năng trình soạn thảo có thể hiển thị ý nghĩa toán tử theo yêu cầu, cho phép các nhà phát triển chọn mức độ trừu tượng ký hiệu ưa thích của họ.

Tranh cãi về thư viện lens minh họa thách thức đang diễn ra trong việc làm cho các khái niệm lập trình nâng cao trở nên dễ tiếp cận mà không hy sinh sức mạnh của chúng. Khi các ý tưởng lập trình hàm tiếp tục ảnh hưởng đến phát triển chính thống, việc tìm ra sự cân bằng phù hợp giữa độ chính xác toán học và khả năng sử dụng thực tế vẫn là một lĩnh vực tranh luận tích cực của cộng đồng.

Tham khảo: lens: Lenses, Folds, and Traversals