As an aside, your showStackHead can be cleaner using pattern matching. Letting you compare the comparison, head and tail:
showStackHead [] = return []
showStackHead (x:xs) = do
putStrLn $ "result: " ++ [x]
return xs
main :: IO ()
main = do
let s1 = []
r1 <- showStackHead s1
putStrLn $ "returned: " ++ r1
putStrLn "---"
let s2 = "foo"
r2 <- showStackHead s2
putStrLn $ "returned: " ++ r2
putStrLn "---"
let s3 = "q"
r3 <- showStackHead s3
putStrLn $ "returned: " ++ r3
source
share