- Giá trị trả về của hàm
Enum.all? với danh sách rỗng là true
- Các hàm
all của Haskell, all của Python, và every? của Clojure cũng hoạt động giống hệt
- Việc trả về true cho danh sách rỗng giúp triển khai dễ hơn
true && f(elem1) && f(elem2) ...
- Nhưng không phải vì sự tiện lợi trong triển khai mà nó được làm như vậy
- Mà là vì nó được triển khai sao cho phù hợp với định nghĩa chân lý hiển nhiên do rỗng (vacuous truth) trong logic học
- Để hiểu vacuous truth, cần xem qua mệnh đề kéo theo vật chất
- Nếu p là sai thì p → q luôn đúng
- “Nếu Tượng Nữ thần Tự do ở Seoul thì Tháp Eiffel ở Pohang” là một mệnh đề đúng
- Vì p, tức “Tượng Nữ thần Tự do ở Seoul”, là sai
- Trong kiểu mệnh đề kéo theo này, khi p sai nên toàn bộ mệnh đề mặc nhiên đúng, đó được gọi là vacuous truth
- Trong vacuous truth, với tập hợp rỗng thì bất kỳ mệnh đề nào cũng trở thành đúng
- Lấy ví dụ “mọi chiếc điện thoại trong phòng đều đang tắt”
- x là mọi vật trong phòng
- P(x) là “x là điện thoại”
- Q(x) là “x đang tắt”
- Vì x là rỗng nên P(x) là sai. Theo vacuous truth, mệnh đề này luôn đúng.
- Vì vậy, giá trị trả về của hàm
Enum.all? với danh sách rỗng là true.
3 bình luận
Mình học được thêm rồi hehe, cảm ơn bạn đã chia sẻ.
Về mặt toán học và khoa học máy tính thì là như vậy, nhưng khi code vẫn dễ bị rối nên có vẻ không nên áp dụng nhiều đâu haha.
Đặc biệt là trong câu lệnh
if, danh sách rỗng được nhận diện làFalsenên rất dễ gây nhầm lẫn.Theo Python thì như bên dưới.
all([]) == True
all([[]]) == False
Vì vậy, tôi thiên về cách viết điều kiện một cách tường minh để người đọc code dễ hiểu hơn.
Ví dụ như dùng
if len(arr) == 0:thay vìif not arr:.Hoặc dùng
if flag is False:thay choif not flag:.Theo tiêu chí của tôi,
all([[]])thì nên được viết lại thànhall([biểu_thức_điều_kiện for ... in []])để code dễ đọc hơn.À~ trong Python, danh sách rỗng là
falsy valuenênall([[]])trả vềFalsenhỉ. Vìtruthyvàfalsy valuekhác nhau giữa các ngôn ngữ, nên khi dùng ngôn ngữ khác thỉnh thoảng mình lại mắc lỗi. :)Tham khảo thêm thì Elixir chỉ coi
nilhoặcfalselàFalsy values, nênEnum.all?([[]])sẽ cho ratrue.