代码之家  ›  专栏  ›  技术社区  ›  Paul Hollingsworth

haskell noob问题:我的append函数有什么问题?

  •  1
  • Paul Hollingsworth  · 技术社区  · 15 年前

    我想写一个haskell附加函数…以下是我的资料:

    myappend :: [a] -> [a] -> [a]
    myappend [] x = x
    myappend [x:xs] y = x : myappend xs y
    

    但它给了我一个错误: 发生检查:无法构造无限类型:a=[a] 常规化“myappend”的类型时

    所以,很明显它有点问题,但我看不见它…我的附加函数有什么问题?

    3 回复  |  直到 15 年前
        1
  •  13
  •   fishlips    15 年前

    类型[A]的构造函数是:

    []  The empty list
    (:) Cons operator (just a regular infix constructor)
    

    因此,您必须使用:

    myappend :: [a] -> [a] -> [a]
    myappend [] x = x
    myappend (x:xs) y = x : myappend xs y
    

    句法

    [x:xs]
    

    相当于

    [(x:xs)]
    

    它将一个列表与一个元素、一个非空列表匹配,并且具有类型

    [(x:xs)] :: [[a]]
    

    我推荐阅读 this page 如果您想了解构造函数和模式匹配概念。

        2
  •  4
  •   sth    15 年前

    函数的第二种情况下的模式应该是 (x:xs) 不是 [x:xs] :

    myappend (x:xs) y = x : myappend xs y
    

    x:xs 匹配一个元素,后面跟着一个列表,括号就在那里,以使它在语法上明确属于该模式的内容。 [X:XS] 将匹配包含 X: XS .

        3
  •  1
  •   Rafał Rawicki    15 年前

    应该没有 [] 括号内 myappend (x:xs) y = x : (myappend xs y)

    [1,2,3] 1:2:3:[] 是定义相同列表的不同方法。 以便 [x:xs] 匹配由另一个列表组成的项目列表。