
Brandon S. Allbery KF8NH wrote:
On Dec 24, 2007, at 13:18 , Isaac Dupree wrote:
Paulo J. Matos wrote:
On Dec 23, 2007 12:44 PM, Isaac Dupree
wrote: parseHeader3 bs = do (x, rest) <- BS.readInt $ BS.dropWhile (not . isDigit) bs (y, _) <- BS.readInt $ BS.dropWhile (not . isDigit) rest return (x, y) What happens then if the first BS.readInt return Nothing??? when the first one returns Nothing, the whole expression becomes Nothing without examining the later parts of computation (as Chaddaï said)
One thng that's not obvious here is that pattern match failure translates to a call to "fail", which in the definition of Monad for Maybe becomes Nothing.
(Hm. Isaac: I thought that translation only happened for the "do" sugar, and in the direct case you must do it yourself or Haskell raises the "incomplete pattern match" exception?)
Tuple-matching never fails (except for _|_) -- there's only one constructor. In this case it's only the intrinsic failure of BS.readInt. You're thinking of something like do [a,b] <- readListOfInts foo return (a+b) --readListOfInts is a function I made up :: String -> Maybe [Int] which can fail (1) if readListOfInts returns Nothing (2) because of the do-notation, also if the list doesn't have exactly two elements in it. Isaac