我对列表的定义有问题。通常是列表定义为data [a] = [] | a : [a]
但如果我在我的代码上写这样的东西具体,我将定义data T a = N | a -> (T a)
解释器给我一个错误:
格式错误的类型或类声明
你知道什么是错的吗?
答案 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