Jawaban Karl baik. Ini adalah penggunaan tambahan yang menurut saya tidak ada orang lain yang sebutkan. Tipe dari
if E then A else B
harus tipe yang mencakup semua nilai dalam tipe A
dan semua nilai dalam tipe B
. Jika jenisnya B
adalah Nothing
, maka jenis if
ekspresi dapat berupa jenis A
. Saya akan sering menyatakan rutinitas
def unreachable( s:String ) : Nothing = throw new AssertionError("Unreachable "+s)
untuk mengatakan bahwa kode tidak diharapkan tercapai. Karena tipenya adalah Nothing
, unreachable(s)
sekarang dapat digunakan dalam if
atau (lebih sering) switch
tanpa mempengaruhi jenis hasil. Sebagai contoh
val colour : Colour := switch state of
BLACK_TO_MOVE: BLACK
WHITE_TO_MOVE: WHITE
default: unreachable("Bad state")
Scala memiliki tipe Nothing.
Kasus penggunaan lain untuk Nothing
(sebagaimana disebutkan dalam jawaban Karl) adalah Daftar [Tidak Ada] adalah jenis daftar yang masing-masing anggotanya bertipe Tidak Ada. Dengan demikian dapat menjadi jenis daftar kosong.
Properti utama Nothing
yang membuat use case ini bekerja adalah tidak memiliki nilai - walaupun dalam Scala, misalnya, tidak memiliki nilai - itu adalah subtipe dari setiap tipe lainnya.
Misalkan Anda memiliki bahasa tempat setiap jenis berisi nilai yang sama - sebut saja ()
. Dalam bahasa seperti itu, tipe unit, yang ()
hanya memiliki nilai, bisa menjadi subtipe dari setiap tipe. Itu tidak membuatnya menjadi tipe terbawah dalam arti bahwa OP berarti; OP jelas bahwa tipe bawah tidak mengandung nilai. Namun, karena ini adalah tipe yang merupakan subtipe dari setiap tipe, ini dapat memainkan peran yang sama dengan tipe terbawah.
Haskell melakukan sesuatu yang sedikit berbeda. Di Haskell, ekspresi yang tidak pernah menghasilkan nilai dapat memiliki skema tipe forall a.a
. Sebuah instance dari skema tipe ini akan menyatu dengan tipe lainnya, sehingga ia secara efektif bertindak sebagai tipe terbawah, meskipun (standar) Haskell tidak memiliki gagasan tentang subtyping. Misalnya, error
fungsi dari pendahuluan standar memiliki skema jenis forall a. [Char] -> a
. Jadi kamu bisa menulis
if E then A else error ""
dan tipe ekspresi akan sama dengan tipe A
, untuk ekspresi apa pun A
.
Daftar kosong di Haskell memiliki skema jenis forall a. [a]
. Jika A
adalah ekspresi yang tipenya adalah tipe daftar, maka
if E then A else []
adalah ekspresi dengan tipe yang sama dengan A
.
void
data ...