如何在Haskell中实现++?

时间:2014-08-26 10:05:19

标签: haskell

嗨,我是Haskell编程的新手。我试图实现运算符" ++"我自己。这是我写的一个小程序,但它不会起作用:

append (es:e) xs = 
    if (null es)
    then e:xs
    else append es (e:xs)

我收到了很多关于[a],[[a]]和[[[a]]]的类型错误。关于Haskell中的列表类型仍然令人困惑。有人可以帮助我吗?谢谢。 :)

1 个答案:

答案 0 :(得分:19)

append (es:e) xs =
        ^^^^

通常情况下,你会写(e:es),这可以在“es列表之前”之前说出来。您实际上已经使用了下面的含义,但已告诉编译器es是一个元素而e是一个列表 - 它会产生您收到的类型错误。

    if (null es)

这不是你应该如何测试一个emtpy列表。事实上,如果你打电话给append [] …,你会得到一个“非详尽的模式”错误,因为(e:es)始终是至少一个元素的列表。所以尝试两种模式:

append []     xs = xs
append (e:es) xs = append es (e:xs)

但是,这仍然无法正常工作 - 第一个列表实际上是通过此代码段反转的。相反,第一个元素(e)需要先于列表的其余部分(esxs):

append (e:es) xs = e : (append es xs)

(这确实是how ++ is implemented