# 99 questions/Solutions/22

### From HaskellWiki

< 99 questions | Solutions(Difference between revisions)

(slightly modified the version with guards so that it will make backwards ranges too) |
m (This edit provides another method of computing the range without using reverse) |
||

Line 18: | Line 18: | ||

| start == stop = [stop] | | start == stop = [stop] | ||

| start < stop = start:range (start+1) stop | | start < stop = start:range (start+1) stop | ||

+ | </haskell> | ||

+ | The following does the same but without using a reverse function | ||

+ | <haskell> | ||

+ | range :: Int -> Int -> [Int] | ||

+ | range n m | ||

+ | | n == m = [n] | ||

+ | | n < m = n:(range (n+1) m) | ||

+ | | n > m = n:(range (n-1) m) | ||

</haskell> | </haskell> | ||

Since there's already syntactic sugar for ranges, there's usually no reason to define a function like 'range' in Haskell. In fact, the syntactic sugar is implemented using the enumFromTo function, which is exactly what 'range' should be. | Since there's already syntactic sugar for ranges, there's usually no reason to define a function like 'range' in Haskell. In fact, the syntactic sugar is implemented using the enumFromTo function, which is exactly what 'range' should be. |

## Revision as of 01:23, 17 March 2011

Create a list containing all integers within a given range.

range x y = [x..y]

or

range = enumFromTo

or

range x y = take (y-x+1) $ iterate (+1) x

or

range start stop | start > stop = reverse (range stop start) | start == stop = [stop] | start < stop = start:range (start+1) stop

The following does the same but without using a reverse function

range :: Int -> Int -> [Int] range n m | n == m = [n] | n < m = n:(range (n+1) m) | n > m = n:(range (n-1) m)

Since there's already syntactic sugar for ranges, there's usually no reason to define a function like 'range' in Haskell. In fact, the syntactic sugar is implemented using the enumFromTo function, which is exactly what 'range' should be.