2017-07-07 94 views
0

從我對類型關鍵字的理解中,type關鍵字創建同義詞。瞭解haskell中的類型關鍵字

type String = [Char] 

但我怎麼能解釋是這樣的:

type Newtype = Bool 
     Int 
     String 
+8

你從哪裏找到第二個代碼片段。這不是有效的Haskell代碼。 –

+2

@WillemVanOnsem從理論上講,它是有效的Haskell;它所做的是將'Newtype'類型定義爲'(Bool Int)String'。這是不好的,因爲'Bool'不接受任何類型參數。但是,'輸入Newtype = Int String'將是合法的。 - 顯然你是對的:這看起來好像有人完全搞砸了'newtype'關鍵字的例子。 – leftaroundabout

+3

@leftaroundabout:是的,它在語法和語法上是有效的Haskell。但是類型系統會誤報'Bool'類型爲'*'而不是'* - > * - > *'。 –

回答

6

正如人們可以在the documentation閱讀:

2類型和NEWTYPE

的另外兩種方式可以通過向Haskell程序引入類型typenewtype聲明。 type爲類型引入同義詞 ,並使用相同的數據構造函數。 (..)使用類型 聲明時,類型同義詞及其基本類型幾乎在任何地方都是可互換的 (在處理 實例聲明時有一些限制)。

所以type <name> = <type-expression>只是重新命名一個(通常是更復雜的)類型的表達式。結果第二個代碼片段是無效

然而,有可能存在於<type-expression>像高階類型:

type Alias = Either Int String 

這是因爲Either類型是高階型:它有「元類型」 * -> * -> *。所以在這裏你可以「應用」IntStringEither

注意,別名沒有任何特殊的語義: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是一類不接受任何(二)型參數。因此它不能構造這樣的類型。