簡體   English   中英

列表的標准定義

[英]Standard definition of list

我對列表的定義有疑問。 通常列表定義為data [a] = [] | a : [a] data [a] = [] | a : [a]但如果我在我的代碼上寫這樣的東西,我會定義data T a = N | a -> (T a) data T a = N | a -> (T a)解釋器給我一個錯誤:

類型或類聲明的格式錯誤的頭

你知道怎么回事嗎? .

看起來您的問題是您嘗試使用->作為中綴構造函數,例如:為了使用a -> b -> N語法構建列表)。 這是不允許的,因為 Haskell 中的自定義中綴構造函數必須以:字符開頭。

你奇怪的錯誤消息的原因是因為->在 Haskell 中是為函數類型保留的,正如傑夫的回答所解釋的

試試這個:

-- Create a right-associative infix constructor.
data T a = N | a :-> (T a)
infixr :->

mylist :: T Int
mylist = 10 :-> 17 :-> N

--If we hadn't made the operator right associative,
-- we would need to use explicit parenthesis here
myotherlist :: T Int
myotherlist = 10 :-> (17 :-> N)

-- Example function
isempty :: T a -> Bool
isempty N         = True
isempty (_ :-> _) = False

a -> T a意味着 a 是一個返回T a的函數,所以我認為這是錯誤的。 嘗試這樣的事情。

data T a = N | R a (T a)

N 是空列表(相當於[] )值,R 是值構造函數(相當於:

在右側,您需要某種方式來攜帶a值。 您現在可以正確列出喜歡的列表。

> N -- The empty List
> R 5 N -- a list with a single element and then the end
> R 7 (R 6 (R 5 N)) -- the list 7, 6, 5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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