[英]What programming languages have something like Haskell’s `newtype`
Haskell編程語言有一個newtypes
的概念:如果我寫newtype Foo = Foo (Bar)
,那么創建一個與Bar
同構的新類型Foo
,即兩者之間存在雙射轉換。 這個結構的屬性是:
還有哪些編程語言提供此功能?
當與記錄訪問器/構造器一起使用時,一個示例似乎是C中的單值結構。 當與強制轉換一起使用時,無效候選者將是C中的單值結構,因為編譯器不會檢查強制轉換,或者Java中具有單個成員的對象,因為它們不會共享相同的表示。
相關問題: F#是否具有Haskell的“新類型”? (不) D是否有'newtype'? (不再)。
不過, Frege有這個,不像Haskell那樣沒有額外的關鍵字。 相反,只有一個組件的每種產品類型都是新類型。
例:
data Age = Age Int
此外,所有具有標稱類型且允許根據另一個定義類型的languga都應該具有此功能。 例如Oberon,Modula-2或ADA。 所以之后
type age = integer; {* kindly forgive syntax errors *}
一個人不能混淆年齡和其他數量。
Mercury是一種純邏輯編程語言,類型系統類似於Haskell。
Mercury中的評估是嚴格的而不是懶惰的,因此Mercury等同於newtype
和data
之間沒有語義差異。 因此,恰好只有一個構造函數只有一個參數的任何類型都與該參數的類型相同,但仍被視為相同的類型; 有效的“newtype”是Mercury中的透明優化。 例:
:- type wrapped
---> foo(int)
; bar(string).
:- type wrapper ---> wrapper(wrapped).
:- type synonym == wrapped.
的表示wrapper
將等同於的wrapped
,但是一種獨特的類型,而不是synonym
這簡直是該類型的另一個名稱wrapped
。
Mercury在其表示中使用帶標記的指針。 1嚴格並且被允許對不同類型有不同的表示,水星通常會盡可能地消除拳擊。 例如
“newtype”優化實際上只是該一般概念的一個特定應用。 “包裝器”類型不需要在已經保持“包裝”類型的上方分配任何存儲器單元。 由於它需要零標簽位,因此它也可以適應“包裝”類型的引用中的任何標簽。 因此,對“包裝”類型的整個引用可以內聯到對包裝器類型的引用中,這最終在運行時無法區分。
1此處的詳細信息可能僅適用於低級別C編譯等級。 Mercury也可以編譯為“高級”C或Java。 在Java中顯然沒有任何小問題(盡管我知道“newtype”優化仍然適用),而我對高級C級別的實現細節不太熟悉。
Rust總是允許你創建單字段類型,但是使用最近穩定的repr(transparent)
屬性,您現在可以確信創建的類型將具有精確的數據布局作為包裝類型,甚至可以跨FFI等。
#[repr(transparent)]
pub struct FooWrapper(Foo);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.