คำตอบของ Karl นั้นดี นี่คือการใช้งานเพิ่มเติมที่ฉันไม่คิดว่ามีใครพูดถึง ประเภทของ
if E then A else B
ควรเป็นชนิดที่มีค่าทั้งหมดที่อยู่ในประเภทของที่และค่าทั้งหมดที่อยู่ในประเภทของA Bถ้าชนิดของBเป็นNothingแล้วประเภทของการแสดงออกสามารถเป็นประเภทของif Aฉันมักจะประกาศกิจวัตรประจำวัน
def unreachable( s:String ) : Nothing = throw new AssertionError("Unreachable "+s)
เพื่อบอกว่าไม่สามารถใช้รหัสได้ ตั้งแต่ชนิดของมันคือNothing, unreachable(s)ขณะนี้คุณสามารถใช้ในการใด ๆifหรือ (มักจะมากกว่า) switchโดยไม่มีผลต่อประเภทของผล ตัวอย่างเช่น
val colour : Colour := switch state of
BLACK_TO_MOVE: BLACK
WHITE_TO_MOVE: WHITE
default: unreachable("Bad state")
สกาล่ามีประเภทไม่มีอะไร
อีกกรณีการใช้งานสำหรับNothing(ตามที่ระบุไว้ในคำตอบของคาร์ล) คือรายการ [ไม่มี] คือประเภทของรายการที่สมาชิกแต่ละคนมีไม่มีอะไรพิมพ์ ดังนั้นมันสามารถเป็นประเภทของรายการที่ว่างเปล่า
คุณสมบัติหลักของNothingกรณีที่การใช้งานเหล่านี้ทำงานไม่ได้ว่ามันไม่มีค่า - พอเพียงใน Scala ตัวอย่างเช่นมันไม่มีค่า - มันคือมันเป็นประเภทย่อยของทุกประเภทอื่น ๆ
สมมติว่าคุณมีภาษาที่ทุกประเภทประกอบด้วยค่าเดียวกัน - ()ขอเรียกว่า ในภาษาดังกล่าวชนิดของหน่วยซึ่งมี()ค่าเท่านั้นอาจเป็นประเภทย่อยของทุกประเภท นั่นไม่ได้ทำให้มันเป็นประเภทล่างในแง่ที่ว่า OP หมายถึง; OP ชัดเจนว่าประเภทด้านล่างไม่มีค่า อย่างไรก็ตามเนื่องจากเป็นชนิดที่เป็นชนิดย่อยของทุกประเภทจึงสามารถเล่นบทบาทเดียวกันกับประเภทด้านล่างได้มาก
Haskell ทำสิ่งต่าง ๆ เล็กน้อย ใน Haskell, forall a.aการแสดงออกที่ไม่ก่อให้เกิดความคุ้มค่าสามารถมีโครงการประเภท ตัวอย่างของรูปแบบประเภทนี้จะรวมกับประเภทอื่น ๆ ดังนั้นมันจึงทำหน้าที่เป็นประเภทล่างได้อย่างมีประสิทธิภาพแม้ว่า (มาตรฐาน) Haskell ไม่มีความคิดในการพิมพ์ย่อย ยกตัวอย่างเช่นฟังก์ชั่นจากโหมโรงมาตรฐานมีประเภทโครงการerror forall a. [Char] -> aดังนั้นคุณสามารถเขียน
if E then A else error ""
และประเภทของการแสดงออกจะเป็นเช่นเดียวกับประเภทของสำหรับการแสดงออกใดA ๆA
รายการว่างเปล่าใน Haskell forall a. [a]มีโครงการประเภท ถ้าAเป็นนิพจน์ที่มีประเภทเป็นชนิดรายการ
if E then A else []
Aคือการแสดงออกที่มีประเภทเดียวกับ
voidข้อมูล ...