
Brief: I want to make the parser choice [string "dummy", anystring ] where anystring = many get return the first match. (Thus if "dummy" matches disregarg all following parsers) ..) details: I want to parse some wmii events. They all look this way ClientFocus 2 ClientFocus 2 LeftBarClick 1 web At this moment I only need two of them (FocusTag and UnfocusTag) So I've created the data type type O = String data WMIIEvent = FocusTag Int | UnfocusTag Int | Unkown String -- to be implemented Now I want to create a simple ReadP parser which looks like this: ============= parser code ============================================ instance Read WmiiEvent where readsPrec _ = readP_to_S (foldr1 takeFirst [ rp "FocusTag" FocusTag , rp "UnfocusTag" UnfocusTag , rpUnkown ]) where rp str f = fmap f $ string str >> skipSpaces >> liftM read (many get) rp :: (Read a) => String -> (a -> WmiiEvent) -> ReadP WmiiEvent rpUnkown = (many get) >>= return . Unkown rpUnkown :: ReadP WmiiEvent But I'm getting an ambiguous parse. (because "UnfocusTag 3" makes two parsers of the choice list succeed. How is this done?