簡體   English   中英

用泛型鍵入代數數據類型

[英]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鍵入到at在上述的情況下輸入到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM