Một cuộc khám phá hấp dẫn trong thiết kế ngôn ngữ lập trình đã xuất hiện, đề xuất một sự thay đổi căn bản so với logic boolean truyền thống bằng cách thay thế các giá trị đúng/sai bằng optional types. Khái niệm này thách thức những giả định cơ bản về cách các ngôn ngữ lập trình xử lý logic điều kiện và luồng điều khiển.
Thay Thế Boolean Bằng Options và Results
Ý tưởng cốt lõi tập trung vào việc loại bỏ hoàn toàn các kiểu boolean, thay vào đó sử dụng các kiểu Option<()>
hoặc Result<(), ()>
để biểu diễn những gì chúng ta thường nghĩ là đúng và sai. Trong hệ thống này, true
trở thành Ok(unit)
và false
trở thành Err(unit)
. Cách tiếp cận này biến đổi các câu lệnh điều kiện từ việc đánh giá boolean thành các thao tác hoặc thành công với một giá trị hoặc thất bại với trạng thái lỗi.
Phản ứng của cộng đồng đã trái chiều nhưng tò mò về mặt trí tuệ. Nhiều nhà phát triển nhận ra sự tương đồng với các khái niệm lập trình hàm hiện có, đặc biệt là monads trong Haskell. Một người bình luận đã lưu ý sự giống nhau với hệ thống truthy/falsy của JavaScript, mặc dù đề xuất này có cách tiếp cận có cấu trúc hơn thông qua type safety.
Tương đương kiểu dữ liệu trong hệ thống được đề xuất:
bool
→Option<()>
true
→Ok(unit)
hoặcSome(())
false
→Err(unit)
hoặcNone
- kiểu
test
→Result<(), ()>
(bí danh:??
)
Tái Tưởng Tượng Các Toán Tử Luồng Điều Khiển
Trong hệ thống này, các câu lệnh if
truyền thống trở thành các toán tử nhị phân trả về các giá trị optional. Một câu lệnh if
không có mệnh đề else
sẽ trả về Option<T>
, trong khi các cấu trúc if-else
sẽ trả về Option<T | U>
. Các toán tử and
và or
cũng sẽ hoạt động trên các kiểu optional, tạo ra một hệ thống thống nhất hơn nơi tất cả logic điều kiện hoạt động trên cùng một cấu trúc kiểu cơ bản.
Một số thành viên cộng đồng đã chỉ ra các kết nối với các ngôn ngữ và mô hình hiện có. Việc thực thi hướng mục tiêu của Icon và các phương ngữ Lisp khác nhau đã triển khai các khái niệm tương tự, nơi nil
đóng vai trò là giá trị falsy duy nhất và mọi thứ khác được coi là truthy.
Hành vi của Toán tử với Kiểu Tùy chọn:
None and X
→None
Some(x) and Y
→Some(y)
None or X
→X
Some(x) or Y
→Some(x)
not Err
→Ok
not Ok
→Err
Ý Nghĩa Thực Tế và Bối Cảnh Lịch Sử
Cuộc thảo luận đã tiết lộ rằng khái niệm này không hoàn toàn mới. Nhiều ngôn ngữ lập trình cũ hơn, bao gồm các phương ngữ BASIC sớm và C trước C99, thiếu các kiểu boolean chuyên dụng. Các ngôn ngữ Assembly thường sử dụng so sánh số nguyên và thanh ghi cờ thay vì các giá trị boolean rõ ràng.
Mọi thứ cũ đều trở nên mới mẻ trở lại
Các lợi ích thực tế bao gồm loại bỏ nhu cầu bao bọc Some()
rõ ràng trong nhiều trường hợp và giảm các câu lệnh return sớm trong các hàm. Tuy nhiên, các nhà phê bình lo lắng về sự phức tạp mà điều này mang lại, đặc biệt khi xử lý các định dạng dữ liệu bên ngoài như JSON phân biệt giữa false
, null
và các giá trị bị thiếu.
Các Ngôn Ngữ Lịch Sử Không Có Boolean Chuyên Dụng:
- Hầu hết các phương ngữ BASIC
- C trước C99 (sử dụng số nguyên)
- Hầu hết các ngôn ngữ assembly
- FORTH (boolean được định nghĩa như các từ)
- Emacs Lisp (chỉ
nil
là falsy) - Ruby (chỉ
false
vànil
là falsy)
Sự Hoài Nghi Của Cộng Đồng và Những Thách Thức Kỹ Thuật
Trong khi sự thanh lịch về mặt lý thuyết thu hút nhiều nhà phát triển, các mối quan tâm thực tế chiếm ưu thế trong cuộc thảo luận. Hệ thống vẫn yêu cầu một số hình thức ra quyết định nhị phân ở cấp độ máy, khiến một số người lập luận rằng điều này chỉ che giấu các boolean thay vì loại bỏ chúng. Lập trình GPU shader và các kỹ thuật lập trình không phân nhánh đã chứng minh các cách tiếp cận thay thế cho logic điều kiện mà không có các kiểu boolean truyền thống.
Đề xuất này gặp phải những thách thức trong các tình huống thực tế nơi các giá trị boolean rõ ràng là cần thiết, chẳng hạn như phản hồi API hoặc tệp cấu hình. Các nhà phê bình cho rằng người dùng cuối cùng sẽ tạo ra các kiểu wrapper hoạt động như boolean, có khả năng làm cho hệ thống phức tạp hơn thay vì đơn giản hơn.
Bất chấp những mối quan tâm này, cuộc khám phá này cung cấp những hiểu biết có giá trị về các nguyên tắc thiết kế ngôn ngữ và thách thức các nhà phát triển tái xem xét các khái niệm lập trình cơ bản. Dù thực tế hay không, những thí nghiệm tư duy như vậy đẩy ranh giới về cách chúng ta nghĩ về các hệ thống kiểu và luồng điều khiển trong các ngôn ngữ lập trình.
Tham khảo: Imagining a Language without Booleans