jaror, 10 months ago Of course StateT is perhaps more common and as elegant as Kleisli: recognise :: RE -> StateT String [] () recognise = foldRE empty (pure ()) ch (*>) (<|>) (p -> fix (t -> p *> t <|> pure ())) where ch c = StateT (case x : xs | c == x -> [((), xs)]; _ -> [])
Of course StateT is perhaps more common and as elegant as Kleisli:
StateT
Kleisli
recognise :: RE -> StateT String [] () recognise = foldRE empty (pure ()) ch (*>) (<|>) (p -> fix (t -> p *> t <|> pure ())) where ch c = StateT (case x : xs | c == x -> [((), xs)]; _ -> [])