我有以下代码返回范围内输入列表中的所有数字 由前两个论点给出:
inRange :: Int -> Int -> [Int] -> [Int]
inRange a b xs = [if (x > a && x < b) then x | x <- xs]
它给了我以下错误:
parse error on input '|'
很抱歉,如果我问一个愚蠢的问题,但我真的不知道我做错了什么
答案 0 :(得分:2)
你错过了那个if语句的else
。 haskell中的所有if
也都有else
。
出现|
错误的原因是解析器需要else
,并且找到了|
。
所以要么你想要
[if (x > a && x < b) then x else ??? | x <- xs]
或者你想要
[x | x <- xs, x > a, x < b]
反过来可以改写为
filter (\x -> x > a && x < b) xs
答案 1 :(得分:0)
您要做的是使用列表理解的一种常见方法。
列表理解在Haskell98 report中描述为具有此
aexp -> [ exp | qual1 , ... , qualn ] (list comprehension, n>=1)
qual -> pat <- exp (generator)
| let decls (local declaration)
| exp (guard)
意味着您在[
和|
之间提供了您想要作为新列表元素的内容。这是您使用函数更改列表元素的位置,例如[ head a |
将列出某些a
的头部
|
来到资格赛之后。
他们可以
x <- xs
)您需要的是2名警卫(x > a
和x < b
)和一名发电机(x <- xs
)
所以你需要的是
[ x | x <- xs , x > a, x < b ]
有些人认为列表理解适用于初学者,后来应该用更高阶函数替换,例如filter
和map
,所以在你的情况下,你只需要filter
一些例子
inRange' a b xs = filter (\ x -> (x > a) && (x < b) ) xs
-- eta reduced version (without using xs)
inRange'' a b = filter (\ x -> (x > a) && (x < b) )