カールの答えは良いです。ここに、他の誰も言及していないと思う追加の使用法を示します。のタイプ
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")
ScalaにはそのようなNothingタイプがあります。
Nothing(Karlの答えで述べたように)別のユースケースは、List [Nothing]です。リストのタイプは、各メンバーのタイプがNothingです。したがって、空のリストのタイプになります。
Nothingこれらのユースケースを機能させる重要な特性は、値がないことではありません(たとえば、Scalaでは値がありません)。これは、他のすべてのタイプのサブタイプであるということです。
すべての型に同じ値が含まれる言語があるとします-それを呼び出しましょう()。このような言語では()、唯一の値として持つユニットタイプは、すべてのタイプのサブタイプになる可能性があります。これは、OPが意味する意味でボトムタイプになりません。OPは、ボトムタイプに値が含まれていないことを明確にしました。ただし、すべてのタイプのサブタイプであるタイプであるため、ボトムタイプとほぼ同じ役割を果たすことができます。
Haskellは少し異なる方法で処理します。Haskellでは、値を生成しない式は、scheme型を使用できますforall a.a。この型スキームのインスタンスは他の型と統合されるため、(標準の)Haskellにはサブタイプの概念はありませんが、事実上、ボトム型として機能します。たとえばerror、標準プレリュードの関数には、scheme型がありforall a. [Char] -> aます。だからあなたは書くことができます
if E then A else error ""
および式の型は、型と同じになりA、任意の発現のために、A。
Haskellの空のリストには型スキームがありforall a. [a]ます。場合はA、型がリスト型がある表現はその後、あります
if E then A else []
は、と同じ型の式Aです。
void...データを