# 99 questions/Solutions/2

### From HaskellWiki

< 99 questions | Solutions(Difference between revisions)

Liujiangfeng (Talk | contribs) |
(Added if-based solution) |
||

(5 intermediate revisions by 4 users not shown) | |||

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) | ||

+ | |||

+ | myButLast''''' [] = error "Empty list" | ||

+ | myButLast''''' [x] = error "Too few elements" | ||

+ | myButLast''''' (x:xs) = | ||

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

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

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

+ | |||

+ | |||

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

## Latest revision as of 20:35, 15 November 2015

(*) 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