在讀編譯運行管道的各個階段,type
聲明和newtype
聲明之間有什麼不同?類型和新類型之間的編譯時間和運行時間差
我的假設是,他們編譯成相同的機器指令,而唯一的區別是,當程序typechecked,其中,例如
type Name = String
newtype Name_ = N String
您可以使用一個Name
任何地方String
是必需的,但是如果您使用Name_
(其中String
是預期的,即使它們編碼了相同的信息),類型檢測器也會將您叫出來。
我問這個問題,因爲如果是這樣的話,我看不出有任何理由如下聲明不應該是有效的:
type List a = Either() (a, List a)
newtype List_ a = L (Either() (a, List_ a))
然而,類型檢查器接受第二一但拒絕第一個。這是爲什麼?
這不是一個編譯問題,它是一個類型檢查問題。 Haskell使用「iso-recursive types」而不是「equi-recursive types」,所以如果你希望你的類型是遞歸的,你必須在那裏有一個'data'或'newtype'。每種選擇都有各種各樣的權衡。請參閱Pierce的類型和編程語言以瞭解更多關於這些系統和涉及的選擇。 – luqui 2013-02-11 12:03:52
謝謝,我想我只需要「iso-recursive」和「equi-recursive」這兩個名字就可以知道Google要做什麼!如果你想將其轉換爲答案,我會接受它。 – 2013-02-11 12:08:11