Haskell初学者 - 定义和使用类型

时间:2016-04-09 22:26:59

标签: haskell

我正在尝试相当于正确运行的代码:

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'

我无法弄清楚如何让它发挥作用。

2 个答案:

答案 0 :(得分:5)

MyList的(合理)定义:

data MyList a = Nil | Cons a (MyList a)

...声明有两个构造函数。

  1. Nil(不参加论据)和
  2. Cons,它带有两个参数:第一个类型为a,第二个类型为MyList a
  3. 因此,对于模式匹配,您必须编写类似Cons item rest的内容,例如

    mylen :: (MyList a) -> Int
    mylen Nil = 0
    mylen (Cons item rest) = 1 + mylen rest
    

    但由于您从未使用item,因此习惯上将其替换为_

    请注意aIntMyList a是哪种类型。另一方面,item01rest,甚至NilCons item rest都是这些类型的实例。< / p>

答案 1 :(得分:0)

  mylen :: MyList a -> Int
  mylen Nil = 0
  mylen (Cons _ next) = 1 + mylen next