列表的标准定义

877*_*877 8 syntax haskell types list

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

格式错误的类型或类声明的头

你知道什么是错的吗?.

hug*_*omg 14

看起来你的问题是你试图->用作中缀构造函数:(为了使用a -> b -> N语法构建列表).这是不允许的,因为Haskell中的自定义中缀构造函数必须以:字符开头.

您的奇怪错误消息的原因是因为->在Haskell中保留了函数类型,正如Jeff的答案所解释的那样

试试这个:

-- 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
Run Code Online (Sandbox Code Playgroud)

  • 表情看起来比箭头好得多. (4认同)

Jef*_*ter 7

a -> T a 意味着a是一个返回某些东西的函数,T a所以我认为这是错误的.尝试这样的事情.

data T a = N | R a (T a)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • ( - >)是*type*构造函数,而不是数据构造函数.( - >)有两种类型(比如a和b),并返回一个*类型*,表示一个函数,从a类型的对象到b类型的对象. (4认同)