在第一種類型:
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 Int
到lst1 :: List Int
將被寫爲NEL 2 [] :: NonEmptyList Int
。