Personal tools

99 questions/Solutions/2

From HaskellWiki

< 99 questions | Solutions(Difference between revisions)
Jump to: navigation, search
(copied solution from Editing 99 questions/1 to 10)
 
m (Add description to foldl solution.)
 
(8 intermediate revisions by 5 users not shown)
Line 12: Line 12:
 
myButLast''' (x:(_:[])) = x
 
myButLast''' (x:(_:[])) = x
 
myButLast''' (_:xs) = myButLast''' xs
 
myButLast''' (_:xs) = myButLast''' xs
  +
  +
myButLast'''' = head . tail . reverse
 
</haskell>
 
</haskell>
  +
  +
We can also use a pair to keep the last two elements processed from the list. We take advantage of lazy evaluation, such that if the list is too small, the initial elements in the pair get evaluated, resulting in an error:
  +
<haskell>
  +
myButLast''''' = snd.(foldl (\(a,b) c -> (c,a)) (e1, e2))
  +
where e1 = error "List too small!"
  +
e2 = error "List is null!"
  +
</haskell>
  +
  +
  +
[[Category:Programming exercise spoilers]]

Latest revision as of 15:27, 15 May 2014

(*) Find the last but one element of a list.

myButLast :: [a] -> a
myButLast = last . init
 
myButLast' x = reverse x !! 1
 
myButLast'' [x,_]  = x
myButLast'' (_:xs) = myButLast'' xs
 
myButLast''' (x:(_:[])) = x
myButLast''' (_:xs) = myButLast''' xs
 
myButLast'''' = head . tail . reverse

We can also use a pair to keep the last two elements processed from the list. We take advantage of lazy evaluation, such that if the list is too small, the initial elements in the pair get evaluated, resulting in an error:

myButLast''''' = snd.(foldl (\(a,b) c -> (c,a)) (e1, e2))
    where e1 = error "List too small!"
          e2 = error "List is null!"