# Difference between revisions of "99 questions/Solutions/2"

From HaskellWiki

< 99 questions | Solutions

m (Add description to foldl solution.) |
m (Don't tell new people to write partial functions, come on.) |
||

Line 14: | Line 14: | ||

myButLast'''' = head . tail . reverse |
myButLast'''' = head . tail . reverse |
||

− | </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> |
</haskell> |
||

## Revision as of 07:32, 15 November 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
```