Personal tools

99 questions/Solutions/22

From HaskellWiki

< 99 questions | Solutions(Difference between revisions)
Jump to: navigation, search
m (This edit provides another method of computing the range without using reverse)
(added one solution with scanl)
Line 26: Line 26:
 
     | n < m = n:(range (n+1) m)
 
     | n < m = n:(range (n+1) m)
 
     | n > m = n:(range (n-1) m)
 
     | n > m = n:(range (n-1) m)
 +
</haskell>
 +
or with scanl
 +
<haskell>
 +
range l r = scanl (+) l (replicate (l - r) 1)
 
</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 23:15, 13 January 2012

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)

or with scanl

range l r = scanl (+) l (replicate (l - r) 1)

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.