【问题标题】:Haskell get error when list parameter has more than one element当列表参数包含多个元素时,Haskell 会出错
【发布时间】:2016-10-05 04:19:30
【问题描述】:

我刚进入 Haskell,我正在尝试创建一个函数,它给出一个数字列表将返回其中所有负数的列表。 所以我这样做了

negative:: [Int] -> [Int]

negative [x] = [z | z <- [x], x < 0]

当我尝试只使用列表中的一个元素时,它可以正常工作

负 [-1] 返回 [-1]

负[1]返回[]

但是,当我添加更多数字时,例如 负 [0,-1] 我收到以下错误:

程序错误:模式匹配失败:负 [Num_fromInt instNum_v30 0,Num_fromInt instNum_v30 -1]

我尝试输入带空格和不带空格的数字,但结果是一样的。我猜我的代码有问题,但由于我还在习惯 Haskell,我很难找到它。任何帮助将不胜感激。

【问题讨论】:

  • 这个错误在 SO 上出现的频率很高。我想知道是否有一些课程/教程可以促使初学者使用[x] 作为任意列表的符号,而不是单例列表。

标签: list haskell parameters


【解决方案1】:

只需将表达式左侧的[x] 替换为x,并将表达式x &lt; 0 更改为z &lt; 0(请记住,我们过滤的是单个元素,而不是容器本身)。

我会这样做:

negative :: [Int] -> [Int]
negative x = [z | z <- x, z < 0]

(可选)以下是使用高阶函数解决相同问题的方法:

negative :: [Int] -> [Int]
negative xs = filter (< 0) xs

(如果您不知道高阶函数是什么,请忽略前面的示例。您将在学习过程中了解它们)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 2014-09-18
    • 1970-01-01
    • 2014-04-28
    • 2018-01-09
    相关资源
    最近更新 更多