如何在 Haskell 中生成两个整数(最小值和最大值)内的所有整数的列表?

sk-*_*sk- 1 haskell functional-programming

我是 Haskell 的新手,并试图了解如何编写函数,该函数将采用两个整数并生成该范围内所有整数的列表。

这是我到目前为止所拥有的,但没有运气。

rangeList :: Integer -> Integer -> [Integer]
rangeList n m
 | n == m = []
 | otherwise = n : n + (rangeList n (m-1))
Run Code Online (Sandbox Code Playgroud)

Jos*_*ica 6

您的rangeList函数已存在于 中Prelude,名称为enumFromTo


Wil*_*sem 5

你想要实现的目标已经存在。如果两个界限都包含在内,则为:

rangeList :: Enum a => a -> a -> [a]
rangeList n m = [n .. m]
Run Code Online (Sandbox Code Playgroud)

或者如果上限是排他的,您可以使用pred :: Enum a => a -> a

rangeListExcl :: Enum a => a -> a -> [a]
rangeListExcl n m = [n .. pred m]
Run Code Online (Sandbox Code Playgroud)

您自己的实现的主要问题是n + rangeList n (m-1)没有多大意义,因为rangeList n (m-1)will 是一个元素列表,并且n这里是 an Integer,所以您不能将它们添加在一起。即使您可以这样做,它仍然无法正常工作,因为 会在和 之间rangeList n (m-1)创建一个序列,通过添加到该结果,您会得到和之间的范围。递归应将上限增加 1,例如:nm-1n2*nn+m-1

rangeListExl :: (Ord a, Num a) => a -> a -> [a]
rangeListExcl n m
    | n >= m = []
    | otherwise = n : rangeListExcl (n+1) m
Run Code Online (Sandbox Code Playgroud)