Câu trả lời của Karl là tốt. Đây là một cách sử dụng bổ sung mà tôi không nghĩ có ai khác đã đề cập. Các loại
if E then A else B
phải là một loại bao gồm tất cả các giá trị trong loại A
và tất cả các giá trị trong loại B
. Nếu loại B
là Nothing
, thì loại if
biểu thức có thể là loại A
. Tôi sẽ thường xuyên tuyên bố một thói quen
def unreachable( s:String ) : Nothing = throw new AssertionError("Unreachable "+s)
để nói rằng mã dự kiến sẽ không đạt được. Vì loại của nó là Nothing
, unreachable(s)
bây giờ có thể được sử dụng trong bất kỳ if
hoặc (thường xuyên hơn) switch
mà không ảnh hưởng đến loại kết quả. Ví dụ
val colour : Colour := switch state of
BLACK_TO_MOVE: BLACK
WHITE_TO_MOVE: WHITE
default: unreachable("Bad state")
Scala có một loại Không có gì.
Một trường hợp sử dụng khác cho Nothing
(như được đề cập trong câu trả lời của Karl) là Danh sách [Không có gì] là loại danh sách mà mỗi thành viên có loại Không có gì. Do đó, nó có thể là loại danh sách trống.
Thuộc tính quan trọng của Nothing
các trường hợp sử dụng này hoạt động không phải là nó không có giá trị - mặc dù trong Scala, chẳng hạn, nó không có giá trị - đó là kiểu con của mọi loại khác.
Giả sử bạn có một ngôn ngữ trong đó mọi loại đều chứa cùng một giá trị - hãy gọi nó ()
. Trong ngôn ngữ như vậy, loại đơn vị, có ()
giá trị duy nhất, có thể là một kiểu con của mọi loại. Điều đó không làm cho nó trở thành một loại dưới cùng theo nghĩa của OP; OP rõ ràng là loại dưới cùng không chứa giá trị. Tuy nhiên, vì nó là một kiểu con của mọi loại, nó có thể đóng vai trò tương tự như một loại dưới cùng.
Haskell làm mọi thứ một chút khác nhau. Trong Haskell, một biểu thức không bao giờ tạo ra giá trị có thể có sơ đồ kiểu forall a.a
. Một thể hiện của sơ đồ loại này sẽ hợp nhất với bất kỳ loại nào khác, do đó, nó hoạt động hiệu quả như một loại dưới cùng, mặc dù (tiêu chuẩn) Haskell không có khái niệm về phân nhóm. Ví dụ, error
hàm từ khúc dạo đầu tiêu chuẩn có sơ đồ kiểu forall a. [Char] -> a
. Vì vậy bạn có thể viết
if E then A else error ""
và loại biểu thức sẽ giống như loại A
, cho bất kỳ biểu thức nào A
.
Danh sách trống trong Haskell có sơ đồ loại forall a. [a]
. Nếu A
là một biểu thức có kiểu là loại danh sách, thì
if E then A else []
là một biểu thức có cùng loại với A
.
void
dữ liệu trong C ...