get' = Get return look' = Look return sat' p = do a <- get' ; if p a then return a else Fail char' c = sat' (c == ) string' s = do str <- look' ; scan s str where scan [] _ = return s scan (x:xs) (y:ys) | x == y = do get' ; scan xs ys scan _ _ = Fail みたいにReadPでくるまないバージョンも用意できて、それもrunで使える。 www.cs.chalmers.se/Cs/Grundutb/Kurser/afp/2006/Papers/parser-claessen.pdf ここにも効率がって書いてあるけどどんな場合なのかさっぱりだ。。