在haskell中编写递归inRange函数

在haskell中编写递归inRange函数,haskell,recursion,Haskell,Recursion,我得到了一个通过递归编写inRange函数的练习,即:用一个列表给出两个数字(表示范围),它应该返回一个新列表,其中包含这两个数字之间的所有数字,包括提供的两个范围数字 显然,基本情况之一应该是列表是否为空 在a b[]=[]范围内,但除此之外,我完全迷路了。我尝试过使用保护性语句,但是我还是很迷茫。这个怎么样 inRange :: Int -> Int -> [Int] inRange x y | x == y = [x] | x < y = x :

我得到了一个通过递归编写inRange函数的练习,即:用一个列表给出两个数字(表示范围),它应该返回一个新列表,其中包含这两个数字之间的所有数字,包括提供的两个范围数字

显然,基本情况之一应该是列表是否为空 在a b[]=[]范围内,但除此之外,我完全迷路了。我尝试过使用保护性语句,但是我还是很迷茫。

这个怎么样

inRange :: Int -> Int -> [Int]
inRange x y | x == y = [x]
            | x < y = x : inRange (x + 1) y
inRange::Int->Int->[Int]
在范围x y | x==y=[x]
|x

实际上,您不必将列表作为参数传递给此

,因为递归通常由两部分组成:

  • 一个或多个基本情况,例如空列表:

    inRange _ _ [] = []
    
  • 在一个或多个递归情况下(或归纳情况下)。显然,当列表不为空时就是这种情况

现在对于后者,有两个选项:列表的第一个数字在范围内,或者不在范围内。如果是,我们列举它,如果不是,我们不列举:

inRange a b (x:xs) | a <= x && x <= b = x : tl
                   | otherwise = tl
                   where tl = inRange a b xs

inRange a b(x:xs)| a我想你看错了问题规格:给你一个列表,如果我理解正确,你需要对它执行某种过滤操作。对不起,只要重新阅读你的帖子,你想输入一个列表,我会把答案留在这里以供参考,虽然这不是我的帖子,但无论如何;)。哈哈-我想我们基本上是同时评论的;)到目前为止你做了什么?谢谢,这个解决方案非常完美!谢谢你把一切都说清楚了。
inRange a b (x:xs) | a <= x && x <= b = x : tl
                   | otherwise = tl
                   where tl = inRange a b xs
inRange _ _ _ = []