On page 76 we define a function item as parser -- a function that takes a String and returns [(Char, String)] or [] if failed.
On page 78 we define a function sat that takes a predicate p and "wraps" a parser construction around that
p :: (Char -> Bool) -> Parser Char
sat p = do x <- item
if p x then return x else failure
What I don't understand is the magic of <-? If the result of item is not empty then this operator should unwrap the list and fetch the first item from the tuple, otherwise it should produce something that won't choke the predicate. What am I missing?