我刚进入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,所以我很难找到它。任何帮助将不胜感激。
答案 0 :(得分:3)
只需将表达式左侧的[x]
替换为x
,然后将表达式x < 0
更改为z < 0
(请记住,我们正在筛选出个人元素,而不是容器本身)。
我将如何做到这一点:
negative :: [Int] -> [Int]
negative x = [z | z <- x, z < 0]
(可选)以下是使用高阶函数解决相同问题的方法:
negative :: [Int] -> [Int]
negative xs = filter (< 0) xs
(如果您不知道高阶函数是什么,请忽略前面的示例。随着时间的推移,您将了解它们)