[英]Typing algebraic data type with generic type
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(列表t)”也可以讀作“ C t E”?
data NonEmptyList a = NEL a [a]
lst2 :: NonEmptyList = 2
為什么不能2鍵入到a
如t
在上述的情況下輸入到2?
在第一種類型中:
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]
是相同的[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
,這是一個語法錯誤,很難猜測您的意思,但是與lst1 :: List Int
等效的NonEmptyList Int
lst1 :: List Int
將被寫為NEL 2 [] :: NonEmptyList Int
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.