12 คะแนน โดย ohyecloudy 2023-12-17 | 3 ความคิดเห็น | แชร์ทาง WhatsApp
  • ค่าที่ฟังก์ชัน 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 ความคิดเห็น

 
tapu1125 2023-12-18

ได้ความรู้เลยครับ ขอบคุณที่แชร์
แม้แนวคิดทางคณิตศาสตร์และวิทยาการคอมพิวเตอร์จะเป็นแบบนี้ แต่พอเขียนโค้ดจริงก็มักสับสน เลยดูเหมือนว่าไม่ค่อยเหมาะจะนำไปใช้เท่าไรครับ
โดยเฉพาะใน if มักจะสับสนมาก เพราะลิสต์ว่างถูกมองเป็น False

ถ้าอิงตาม Python จะเป็นดังนี้
all([]) == True
all([[]]) == False

 
p0rygon 2023-12-18

ดังนั้นสำหรับผมแล้ว ผมชอบเขียนเงื่อนไขให้ชัดเจนเพื่อคนที่จะมาอ่านโค้ดในภายหลัง
เช่นใช้ if len(arr) == 0: แทน if not arr:
หรือใช้ if flag is False: แทน if not flag: ก็เป็นตัวอย่างได้เหมือนกัน

ตามเกณฑ์ของผม all([[]]) ก็ควรเขียนใหม่เป็น all([조건식 for ... in []]) เพื่อให้อ่านโค้ดได้เข้าใจง่ายขึ้น

 
ohyecloudy 2023-12-18

อ๋อ~ ใน Python ลิสต์ว่างเป็นค่า falsy ก็เลยทำให้ค่ารีเทิร์นของ all([[]]) เป็น False สินะครับ แต่ละภาษามีค่า Truthy, Falsy ต่างกัน พอไปใช้ภาษาอื่นก็เลยเผลอพลาดกันได้เป็นครั้งคราว :)

เพิ่มเติมคือใน Elixir มีแค่ nil หรือ false เท่านั้นที่เป็นค่า Falsy ดังนั้นค่า Enum.all?([[]]) จึงออกมาเป็น true ครับ