main = do print $ safeHead ([] :: [Int]) print $ safeHead ([1,2] :: [Int]) safeHead :: [a] -> Maybe a safeHead = partial head (not . null) partial :: (a -> b) -> (a -> Bool) -> a -> Maybe b partial f p x | p x = Just $ f x | otherwise = Nothing