
On 10/11/2014, at 8:07 am, Roelof Wobben
Found it.
This is working ;
last3::[a]-> Maybe a; last3 a | null a = Nothing | length a == 1 = Just (head a) | otherwise = last3 (tail a)
I believe it has already been mentioned, but what you have here is an O(|a|**2) solution. The way I’d write it is last4 :: [a] -> Maybe a last4 [] = Nothing last4 (x:xs) = Just $ loop x xs where loop x [] = x loop _ (y:ys) = loop y ys In ghci, *Main> :set +s *Main> last3 [1..10000] Just 10000 (0.14 secs, 13696656 bytes) *Main> last4 [1..10000] Just 10000 (0.00 secs, 3131552 bytes) *Main> last3 [1..100000] Just 100000 (11.92 secs, 33134136 bytes) *Main> last4 [1..100000] Just 100000 (0.02 secs, 15520360 bytes) You really _don’t_ want to be calling length in a loop like that. length a == 1 if and only if a == [_] Using null, head, tail is not really the Haskell Way. last3 [] = Nothing last3 [x] = Just x last3 (_:xs) = last3 xs