data Reg = Zero | One | Char Char | Plus Reg Reg | Times Reg Reg | Star Reg deriving Show acc :: String -> Reg -> (String -> Bool) -> Bool acc s Zero k = False acc s One k = k s acc [] (Char _) k = False acc (c : s) (Char c') k = if c == c' then k s else False acc s (Plus r1 r2) k = (acc s r1 k) || (acc s r2 k) acc s (Times r1 r2) k = acc s r1 (\s' -> acc s' r2 k) acc s (Star r) k = (k s) || (acc s r (\s' -> acc s' (Star r) k)) accept :: String -> Reg -> Bool accept s r = acc s r (\s' -> if s' == [] then True else False) bin :: String -> Bool bin s = accept s (Times (Star (Plus (Char '0') (Char ('1')))) (Plus (Char '0') (Char ('1')))) one :: String -> Bool one s = accept s (Char '1')