我正在尝试相当于正确运行的代码:
len :: [a] -> Int
len [] = 0
len (x:xs) = 1 + len xs
但对于我定义为的MyList类型:
data MyList a = Nil | Cons a (MyList a)
这是我的尝试:
mylen :: (MyList a) -> Int
mylen Nil = 0
mylen (Cons a (MyList a)) = 1 + mylen (MyList a)
但是我得到了这些错误:
'a'的定义冲突
不在范围内:数据构造函数'MyList'
我无法弄清楚如何让它发挥作用。
答案 0 :(得分:5)
MyList
的(合理)定义:
data MyList a = Nil | Cons a (MyList a)
...声明有两个构造函数。
Nil
(不参加论据)和Cons
,它带有两个参数:第一个类型为a
,第二个类型为MyList a
因此,对于模式匹配,您必须编写类似Cons item rest
的内容,例如
mylen :: (MyList a) -> Int
mylen Nil = 0
mylen (Cons item rest) = 1 + mylen rest
但由于您从未使用item
,因此习惯上将其替换为_
。
请注意a
,Int
和MyList a
是哪种类型。另一方面,item
,0
和1
,rest
,甚至Nil
和Cons item rest
都是这些类型的实例。< / p>
答案 1 :(得分:0)
mylen :: MyList a -> Int
mylen Nil = 0
mylen (Cons _ next) = 1 + mylen next