Karl'ın cevabı iyidir. İşte kimsenin bahsetmediğini sanmadığım ilave bir kullanım. Türü
if E then A else B
tipine tüm değerleri içeren bir tür olmalı A
ve tipi tüm değerleri B
. Eğer tür B
ise Nothing
, o zaman if
ifadenin tipi de olabilir A
. Sık sık rutin ilan edeceğim
def unreachable( s:String ) : Nothing = throw new AssertionError("Unreachable "+s)
bu koda ulaşılmasının beklenmeyeceğini söylemek için. Türü olduğundan Nothing
, sonuç türünü etkilemeden unreachable(s)
herhangi bir if
veya daha sık kullanılabilir switch
. Örneğin
val colour : Colour := switch state of
BLACK_TO_MOVE: BLACK
WHITE_TO_MOVE: WHITE
default: unreachable("Bad state")
Scala böyle bir şey yok.
Nothing
(Karl'ın cevabında da belirtildiği gibi) için bir başka kullanım örneği Liste [Hiçbir şey], her birinin üyeleri Nothing tipindeki listelerin tipidir. Böylece boş listenin türü olabilir.
Anahtar özelliği Nothing
olduğunu bu kullanım durumları işlerimizi kolaylaştırır değil o onu her türde bir alt tipi olmasıdır values-- Scala, örneğin, hiç var --although hiçbir değer olduğunu.
Her türün aynı değeri içerdiği bir dilin olduğunu varsayalım - hadi diyelim ()
. Böyle bir dilde, ()
tek değeri olan birim tipi, her tipin bir alt tipi olabilir. Bu OP'nin kastettiği anlamda bir alt tip yapmaz; OP, alt tipin değer içermediği konusunda açıktı. Ancak, her türün alt türü olan bir tür olduğundan, alt türle aynı rol oynayabilir.
Haskell işleri biraz farklı yapar. Haskell'de, hiçbir zaman değer üretmeyen bir ifade, tip düzenine sahip olabilir forall a.a
. Bu tür bir şema örneği, başka herhangi bir türle birleşecektir, bu nedenle (standart) Haskell'in alt tipleme nosyonu olmasa da, etkili bir şekilde alt tip olarak davranır. Örneğin error
, standart prelüdden gelen fonksiyon tip düzenine sahiptir forall a. [Char] -> a
. Yani yazabilirsin
if E then A else error ""
ve ifadenin türü A
, herhangi bir ifade için türüyle aynı olacaktır A
.
Haskell'deki boş liste tip düzenine sahiptir forall a. [a]
. Eğer A
kimin tip bir liste türü olan bir ifade, daha sonra ise
if E then A else []
ile aynı tipte bir ifadedir A
.
void