Haskell - 输入中的解析错误

时间:2014-11-14 11:51:57

标签: haskell

我有以下代码返回范围内输入列表中的所有数字 由前两个论点给出:

inRange :: Int -> Int -> [Int] -> [Int]
inRange a b xs = [if (x > a && x < b) then x | x <- xs]

它给了我以下错误:

parse error on input '|'

很抱歉,如果我问一个愚蠢的问题,但我真的不知道我做错了什么

2 个答案:

答案 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 > ax < b)和一名发电机(x <- xs) 所以你需要的是

[ x | x <- xs , x > a, x < b ]

有些人认为列表理解适用于初学者,后来应该用更高阶函数替换,例如filtermap,所以在你的情况下,你只需要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) )