2010-08-26 32 views
9

D是否有'newtype'(如在Haskell中)。D有'newtype'嗎?

這是一個天真的問題,因爲我只是在瀏覽D,但Google沒有提供任何有用的東西。

在Haskell中,這是一種在編譯時使不同類型的相同事物不同的方式,但不會導致任何運行時性能損失。

例如你可以製作米,秒和千克的新類型(雙打)。如果您的程序以秒爲單位將數量以米爲單位添加到數量,那麼在編譯時會出錯,但在運行時會像運行時一樣快(如果兩者都是雙精度的)。

如果D沒有類似'newtype'的東西,那麼處理維數量的可接受方法是什麼?

謝謝,

Chris。

+0

具有合適的運算符重載的薄包裝類可能會完成工作並得到優化。但這只是一個猜測和一個非常醜陋的解決方案。 – delnan 2010-08-26 15:45:19

+1

@delnan:在D中,你可能會使用一個結構,而不是一個類。 – dsimcha 2010-08-26 18:03:32

+0

有一刻我想:「新型?......就像在高達????」 XD – Klaim 2010-09-06 19:09:32

回答

12

在D1.0中有typedef,它是從預定義類型到'newtype'的強打字。

D2.0已將其刪除,只剩下別名(typedef在C中)。有關於有一個可以強烈創建一個新類型的包裝模板的討論。

與typedef有關的問題是,有很好的參數可以使newtype成爲預定義類型的子類型,並且也是使它成爲超類型的好參數。

typedef的語義是將基類型隱式轉換爲newtype,但newtype不會轉換爲具有相同基類型的基類型或其他類型。我在這裏使用基類型:

typedef int Fish; 
typedef Fish Cat; 
Fish gold = 1; 
Cat fluff = gold; 

將無法​​編譯。

而截至目前,2.048 DMD仍允許使用typedef(但不要使用它)。

具有基本類型轉換爲NEWTYPE,這樣你就不必寫

meters = cast(meters) 12.7; 
+1

在'typedef X Y'中,如果'X'可以隱式轉換爲或從'Y'轉換,那麼'typedef'就不像Haskell的'newtype'。 – 2010-09-02 03:44:25

+0

@Read巴頓,我已經接受了這個答案作爲「不,它沒有」的答案。 – fadedbee 2011-09-06 12:00:15

+0

@he_the_great,贊成新類型是超類型的參數是什麼?我們可以在語言中使用subtypedef和supertypedef嗎? – fadedbee 2011-09-06 12:03:16

6

搞笑的是有用的,因爲he_the_great提到,D1產生了濃厚的typedef,但沒有人使用它,可能是因爲這是不可能的爲每個案例定製確切的語義。可能最簡單的方法來處理這種情況,至少對於原始類型來說,就是在Phobos的某個地方加入一個mixin模板,它允許你轉發所有的操作符,但是通過mixin自動生成樣板。然後,你只需創建一個包裝結構並進行全部設置。