99 questions/Solutions/22: Difference between revisions
< 99 questions | Solutions
(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.