從我對類型關鍵字的理解中,type
關鍵字創建同義詞。瞭解haskell中的類型關鍵字
type String = [Char]
但我怎麼能解釋是這樣的:
type Newtype = Bool
Int
String
從我對類型關鍵字的理解中,type
關鍵字創建同義詞。瞭解haskell中的類型關鍵字
type String = [Char]
但我怎麼能解釋是這樣的:
type Newtype = Bool
Int
String
正如人們可以在the documentation閱讀:
2類型和NEWTYPE
的另外兩種方式可以通過向Haskell程序引入類型
type
和newtype
聲明。type
爲類型引入同義詞 ,並使用相同的數據構造函數。 (..)使用類型 聲明時,類型同義詞及其基本類型幾乎在任何地方都是可互換的 (在處理 實例聲明時有一些限制)。
所以type <name> = <type-expression>
只是重新命名一個(通常是更復雜的)類型的表達式。結果第二個代碼片段是無效。
然而,有可能存在於<type-expression>
像高階類型:
type Alias = Either Int String
這是因爲Either
類型是高階型:它有「元類型」 * -> * -> *
。所以在這裏你可以「應用」Int
和String
到Either
。
注意,別名沒有任何特殊的語義:Haskell的Alias
相同Either Int String
,反之亦然:那是在Alias
作品定義與Either Int String
以及每一個方法。
不過,若你寫type NewType = Bool Int String
,那麼類型系統會抱怨說:
• Expecting two fewer arguments to ‘Bool’
Expected kind ‘* -> * -> k0’, but ‘Bool’ has kind ‘*’
• In the type ‘Bool Int String’
In the type declaration for ‘NewType’
所以抱怨Bool
是一類不不接受任何(二)型參數。因此它不能構造這樣的類型。
你從哪裏找到第二個代碼片段。這不是有效的Haskell代碼。 –
@WillemVanOnsem從理論上講,它是有效的Haskell;它所做的是將'Newtype'類型定義爲'(Bool Int)String'。這是不好的,因爲'Bool'不接受任何類型參數。但是,'輸入Newtype = Int String'將是合法的。 - 顯然你是對的:這看起來好像有人完全搞砸了'newtype'關鍵字的例子。 – leftaroundabout
@leftaroundabout:是的,它在語法和語法上是有效的Haskell。但是類型系統會誤報'Bool'類型爲'*'而不是'* - > * - > *'。 –