Skip to content

Instantly share code, notes, and snippets.

@crclark96
Last active April 17, 2020 17:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save crclark96/90761e1250a274f32fddc6f46138d1c3 to your computer and use it in GitHub Desktop.
Save crclark96/90761e1250a274f32fddc6f46138d1c3 to your computer and use it in GitHub Desktop.
import Control.Monad
generateParens :: Int -> [String]
generateParens n = generateParens' n ""
generateParens' :: Int -> String -> [String]
generateParens' n xs
| n == o = [xs ++ replicate u ')']
| u == 0 = generateParens' n (xs ++ "(")
| otherwise = [xs ++ "(", xs ++ ")"] >>= generateParens' n
where o = length $ filter (=='(') xs -- open parens
u = o - (length $ filter (==')') xs) -- unmatched parens
*Main> generateParens 3
["((()))","(()())","(())()","()(())","()()()"]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment