# 99 questions/Solutions/2

### From HaskellWiki

< 99 questions | Solutions(Difference between revisions)

(Added if-based solution) |
|||

Line 29: | Line 29: | ||

if length xs == 1 then x | if length xs == 1 then x | ||

else myButLast''''' xs | else myButLast''''' xs | ||

+ | |||

+ | myButLast'''''' = head . reverse . init | ||

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

[[Category:Programming exercise spoilers]] | [[Category:Programming exercise spoilers]] |

## Latest revision as of 14:30, 25 October 2017

(*) 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) myButLast''''' [] = error "Empty list" myButLast''''' [x] = error "Too few elements" myButLast''''' (x:xs) = if length xs == 1 then x else myButLast''''' xs myButLast'''''' = head . reverse . init