คำตอบของ 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
ข้อมูล ...