【发布时间】:2011-08-01 14:45:09
【问题描述】:
我对列表的定义有疑问。通常列表定义为data [a] = [] | a : [a]
但是如果我在具体的代码上写这样的东西我会定义data T a = N | a -> (T a)解释器给我一个错误:
类型或类声明格式错误
你知道有什么问题吗? .
【问题讨论】:
我对列表的定义有疑问。通常列表定义为data [a] = [] | a : [a]
但是如果我在具体的代码上写这样的东西我会定义data T a = N | a -> (T a)解释器给我一个错误:
类型或类声明格式错误
你知道有什么问题吗? .
【问题讨论】:
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
【讨论】:
Text.Printf 模块),但这很少是您想要的。更常见的解决方案是让您的函数列出一个列表。确实,在 Prelude 中,有一个函数 sum,其类型为 Num a => [a] -> a。
看起来您的问题是您尝试使用-> 作为: 之类的中缀构造函数(为了使用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 = True
isempty (_ :-> _) = False
【讨论】:
isempty N = True ?