單元類型簡介
編輯在被稱為類型理論的數理邏輯和計算機科學領域,單元類型是一種只允許一個值的類型。與單位類型相關的載體(底層集合)可以是任何單子集。任何兩個這樣的集合之間都有一個同構性,所以習慣上我們談論單位類型而忽略其值的細節。我們也可以把單位類型看作是0-元組的類型,即沒有類型的乘積。單位類型是類型和類型化函數類別中的終端對象。它不應與零或底層類型相混淆,后者不允許有任何值,是這個類別中的初始對象。同樣地,布爾類型是有兩個值的類型。單位類型在大多數函數式編程語言中都有實現。在一些命令式編程語言中使用的void類型可以實現它的一些功能,但是由于它的載體集是空的,所以它有一些限制。
在編程語言中
編輯一些計算機編程語言提供了一個單元類型,用于指定具有xxx目的是引起副作用的函數的結果類型,以及不需要參數的函數的論據類型。在Haskell、Rust和Elm中,單元類型被稱為(),其xxx的值也是(),反映了0-tuple的解釋。在ML的后代(包括OCaml、StandardML和F#)中,該類型被稱為單元,但其值被寫成()。在Scala中,單元類型被稱為單元,其xxx的值被寫成()。在CommonLisp中,名為NULL的類型是一個單元類型,它有一個值,即符號NIL。這不應與NIL類型混淆,后者是底層類型。在Python中,有一種類型叫做NoneType,它允許None的單一值。在Swift中,單元類型叫做Void或(),它的xxx值也是(),反映了0-tuple的解釋。在Java中,單元類型叫做Void,它的xxx值是null。在Go中,單元類型寫成struct{},其值是struct{}{}。在PHP中,單元類型叫做null,其xxx值是NULL自身。在JavaScript中,Null(其xxx的值是null)和Undefined(其xxx的值是undefined)都是內置的單元類型。在Kotlin中,Unit是一個只有一個值的單子:Unit對象。在Ruby中,nil是NilClass類的xxx實例。
在C++中,std::monostate單元類型在C++17中被添加。在此之前,可以使用一個空的結構來定義一個自定義的單元類型,如structempty{}。Void類型作為單元類型在C、C++、C#和D中,void用來指定一個不返回任何有用的東西的函數,或者一個不接受任何參數的函數。C語言中的單元類型在概念上類似于空結構,但C語言規范中不允許沒有成員的結構(C++中允許)。相反,"void"的使用方式模擬了單元類型的一些屬性,但不是全部,詳見下文。像大多數命令式語言一樣,C語言允許不返回值的函數;這些函數被指定為具有void返回類型。這樣的函數在其他命令式語言(如Pascal)中被稱為過程,在這些語言中,函數和過程之間有語法上的區別,而不是類型系統上的區別。
調用慣例的區別
編輯真正的單元類型和無效類型之間的xxx個顯著區別是,單元類型可以一直作為函數的參數類型,但無效類型在C語言中不能作為參數的類型,盡管它可以作為列表中的xxx參數出現。下面的程序最能說明這個問題,它是C語言的一個編譯時錯誤。
這個問題在大多數C語言的編程實踐中不會出現,因為空類型不攜帶任何信息,所以無論如何傳遞都是無用的;但在通用編程中可能會出現,比如C++模板,在這種情況下,必須將空與其他類型區別對待。然而在C++中,允許空的類,所以有可能實現一個真正的單元類型;上面的例子變成了可編譯的。(為了簡潔起見,我們在上面的例子中并不擔心the_unit是否真的是一個單子;關于這個問題的細節,請看單子模式)。
存儲方面的區別
編輯第二個明顯的區別是,void類型是特殊的,永遠不能存儲在記錄類型中,即C/C++中的結構或類中。相比之下,單元類型可以存儲在函數式編程語言的記錄中,即它可以作為字段的類型出現;上述C++中單元類型的實現也可以存儲。
內容由匿名用戶提供,本內容不代表www.gelinmeiz.com立場,內容投訴舉報請聯系www.gelinmeiz.com客服。如若轉載,請注明出處:http://www.gelinmeiz.com/170892/