【问题标题】:Haskell Noob question: What's wrong with my append function?Haskell Noob 问题:我的附加功能有什么问题?
【发布时间】:2010-12-14 08:19:53
【问题描述】:

我正在尝试编写一个 Haskell 附加函数...这是我所拥有的:

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

但这给了我一个错误: 发生检查:无法构造无限类型:a = [a] 概括 `myappend' 的类型时

那么,显然它有问题,但我看不到它......我的追加功能有什么问题?

【问题讨论】:

    标签: haskell functional-programming append


    【解决方案1】:

    [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】:

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

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

    x:xs 匹配一个元素后跟一个列表,括号只是为了在语法上明确属于该模式的内容。 [x:xs] 将匹配包含 x:xs 的列表。

    【讨论】:

      【解决方案3】:

      中不应有[] 括号 myappend (x:xs) y = x : (myappend xs y)

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-27
        • 1970-01-01
        • 2018-02-19
        • 2015-05-27
        • 2018-03-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多