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

From HaskellWiki

< 99 questions | Solutions

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

Line 14: | Line 14: | ||

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

+ | |||

+ | lastbut1 :: Foldable f => f a -> a |
||

+ | lastbut1 = fst . foldl (\(a,b) x -> (b,x)) (err1,err2) |
||

+ | where |
||

+ | err1 = error "lastbut1: Empty list" |
||

+ | err2 = error "lastbut1: Singleton" |
||

+ | |||

+ | lastbut1safe :: Foldable f => f a -> Maybe a |
||

+ | lastbut1safe = fst . foldl (\(a,b) x -> (b,Just x)) (Nothing,Nothing) |
||

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

## Revision as of 17:26, 28 December 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
lastbut1 :: Foldable f => f a -> a
lastbut1 = fst . foldl (\(a,b) x -> (b,x)) (err1,err2)
where
err1 = error "lastbut1: Empty list"
err2 = error "lastbut1: Singleton"
lastbut1safe :: Foldable f => f a -> Maybe a
lastbut1safe = fst . foldl (\(a,b) x -> (b,Just x)) (Nothing,Nothing)
```