列表的标准定义

时间:2011-04-08 15:17:22

标签: list haskell types syntax

我对列表的定义有问题。通常是列表定义为data [a] = [] | a : [a] 但如果我在我的代码上写这样的东西具体,我将定义data T a = N | a -> (T a)解释器给我一个错误:

  

格式错误的类型或类声明

你知道什么是错的吗?

2 个答案:

答案 0 :(得分:14)

您的问题似乎是您尝试将->用作:之类的中缀构造函数(为了使用a -> b -> N语法构建列表)。这是不允许的,因为Haskell中的自定义中缀构造函数必须以:字符开头。

您的奇怪错误消息的原因是因为Haskell中的->是为函数类型保留的,因为Jeff's answer解释

请改为尝试:

-- 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         = False
isempty (_ :-> _) = True

答案 1 :(得分:7)

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