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

From HaskellWiki
Jump to navigation Jump to search
(Add foldl based solution.)
 
(4 intermediate revisions by 4 users not shown)
Line 15: Line 15:
 
myButLast'''' = head . tail . reverse
 
myButLast'''' = head . tail . reverse
   
  +
lastbut1 :: Foldable f => f a -> a
myButLast''''' = snd.(foldl (\(a,b) c -> (c,a)) (e1, e2))
+
lastbut1 = fst . foldl (\(a,b) x -> (b,x)) (err1,err2)
where e1 = error "List too small!"
 
  +
where
e2 = error "List is null!"
 
  +
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
 
</haskell>
 
</haskell>
   

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