- ค่าที่ฟังก์ชัน
Enum.all? คืนค่าสำหรับลิสต์ว่างคือ true
- ฟังก์ชัน
all ของ Haskell, all ของ Python และ every? ของ Clojure ก็ทำงานแบบเดียวกัน
- การคืนค่า true สำหรับลิสต์ว่างทำให้ติดตั้งใช้งานได้ง่าย
true && f(elem1) && f(elem2) ...
- แต่ไม่ได้ทำแบบนั้นเพียงเพราะความสะดวกในการติดตั้งใช้งาน
- แต่ทำให้สอดคล้องกับนิยามของความจริงแบบว่างเปล่า (vacuous truth) ในตรรกศาสตร์
- หากต้องการเข้าใจความจริงแบบว่างเปล่า ต้องดูที่ประพจน์เงื่อนไขเชิงสาระ
- ถ้า p เป็นเท็จ แล้ว p → q จะเป็นจริงเสมอ
- “ถ้าเทพีเสรีภาพอยู่ที่โซล หอไอเฟลก็อยู่ที่โพฮัง” เป็นข้อความที่เป็นจริง
- เพราะ p ซึ่งคือ “เทพีเสรีภาพอยู่ที่โซล” เป็นเท็จ
- ในประพจน์เงื่อนไขเชิงสาระลักษณะนี้ เมื่อ p เป็นเท็จจนทำให้ทั้งประพจน์เป็นจริงเสมอ จะเรียกว่า ความจริงแบบว่างเปล่า
- ในความจริงแบบว่างเปล่า สำหรับเซตว่าง จะทำให้ประพจน์ใด ๆ เป็นจริงทั้งหมด
- ยกตัวอย่างเช่น 'โทรศัพท์มือถือทุกเครื่องในห้องถูกปิดอยู่'
- x คือทุกสิ่งในห้อง
- P(x) คือ 'x เป็นโทรศัพท์มือถือ'
- Q(x) คือ 'x ถูกปิดอยู่'
- เนื่องจาก x ว่างอยู่ P(x) จึงเป็นเท็จ และด้วยความจริงแบบว่างเปล่า ประพจน์จึงเป็นจริงเสมอ
- ดังนั้นค่าที่ฟังก์ชัน
Enum.all? คืนค่าสำหรับลิสต์ว่างจึงเป็น true.
3 ความคิดเห็น
ได้ความรู้เลยครับ ขอบคุณที่แชร์
แม้แนวคิดทางคณิตศาสตร์และวิทยาการคอมพิวเตอร์จะเป็นแบบนี้ แต่พอเขียนโค้ดจริงก็มักสับสน เลยดูเหมือนว่าไม่ค่อยเหมาะจะนำไปใช้เท่าไรครับ
โดยเฉพาะใน
ifมักจะสับสนมาก เพราะลิสต์ว่างถูกมองเป็นFalseถ้าอิงตาม Python จะเป็นดังนี้
all([]) == Trueall([[]]) == Falseดังนั้นสำหรับผมแล้ว ผมชอบเขียนเงื่อนไขให้ชัดเจนเพื่อคนที่จะมาอ่านโค้ดในภายหลัง
เช่นใช้
if len(arr) == 0:แทนif not arr:หรือใช้
if flag is False:แทนif not flag:ก็เป็นตัวอย่างได้เหมือนกันตามเกณฑ์ของผม
all([[]])ก็ควรเขียนใหม่เป็นall([조건식 for ... in []])เพื่อให้อ่านโค้ดได้เข้าใจง่ายขึ้นอ๋อ~ ใน Python ลิสต์ว่างเป็นค่า falsy ก็เลยทำให้ค่ารีเทิร์นของ
all([[]])เป็นFalseสินะครับ แต่ละภาษามีค่า Truthy, Falsy ต่างกัน พอไปใช้ภาษาอื่นก็เลยเผลอพลาดกันได้เป็นครั้งคราว :)เพิ่มเติมคือใน Elixir มีแค่
nilหรือfalseเท่านั้นที่เป็นค่า Falsy ดังนั้นค่าEnum.all?([[]])จึงออกมาเป็นtrueครับ