2015-05-14 30 views
1
data List t = E | C t (List t) 
    deriving Show 

lst1 :: List Int 
lst1 = C 2 E 

爲什麼t輸入爲2以防萬一? 由於第一個警衛定義「t = E」,這個原因(List t)是允許的,所以「C t(List t)」也可以被讀爲「C t E」?鍵入代數數據類型與通用類型

data NonEmptyList a = NEL a [a] 
lst2 :: NonEmptyList = 2 

爲什麼不能2被鍵入到a作爲t鍵入到2在上述的情況下?

回答

4

在第一種類型:

data List t = E | C t (List t) 

t類型參數,它必須如現有類型來提供。 E不是一種類型,它是一個數據構造函數值構造函數C也是一個數據構造函數。他們有兩類:

E :: List t 
C :: t -> List t -> List t 

您可以構建像

> E :: List Int -- Equivalent to [] 
E 
> C 1 E :: List Int -- Equivalent to [1] 
C 1 E 
> C 1 (C 2 E) :: List Int -- Equivalent to [1, 2] 
C 1 (C 2 E) 

等等值。您可以將E作爲空列表[]C作爲列表構造函數:,因此C 1 (C 2 (C 3 E))相當於1 : 2 : 3 : [],它與[1, 2, 3]相同。

在第二種類型:

data NonEmptyList a = NEL a [a] 

你有數據構造

NEL :: a -> [a] -> NonEmptyList a 

您可以構建像

> NEL 1 [] :: NonEmptyList Int -- Equivalent to [1] 
NEL 1 [] 
> NEL 1 [2] :: NonEmptyList Int -- Equivalent to [1, 2] 

等等值。這種類型強制你至少有一個值,所以它不能是非空的。

當你寫lst2 :: NonEmptyList = 2,這是一個語法錯誤,這是很難猜測你的意思,但相當於NonEmptyList Intlst1 :: List Int將被寫爲NEL 2 [] :: NonEmptyList Int