カールの答えは良いです。ここに、他の誰も言及していないと思う追加の使用法を示します。のタイプ
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
...データを