fre*_*low 11 recursion haskell pattern-matching pushdown-automaton formal-languages
我编写了以下程序来检查平衡括号的字符串:
isBalanced xs = isBalanced' xs []
isBalanced' [] [] = True
isBalanced' [] _ = False
isBalanced' ('(':xs) ys = isBalanced' xs (')':ys)
isBalanced' ('[':xs) ys = isBalanced' xs (']':ys)
isBalanced' ('{':xs) ys = isBalanced' xs ('}':ys)
isBalanced' _ [] = False
isBalanced' (x:xs) (y:ys) = (x == y) && (isBalanced' xs ys)
Run Code Online (Sandbox Code Playgroud)
以下是一些示例数据:
positives = [
isBalanced "",
isBalanced "()",
isBalanced "[]",
isBalanced "{}",
isBalanced "([]){}[{}]"
]
negatives = [
isBalanced "(",
isBalanced "[",
isBalanced "{",
isBalanced ")",
isBalanced "]",
isBalanced "}",
isBalanced "([)]",
isBalanced "{]",
isBalanced ")("
]
Run Code Online (Sandbox Code Playgroud)
由于这个程序只使用显式递归的最基本的构建块,我想知道是否有一个更短,更高级的方法涉及我还不知道的语言设施.
好的,我从几个答案和评论(以及我自己的想法)中提炼出以下解决方案:
import Text.Parsec
grammar = many parens >> return () where
parens = choice [ between (char opening) (char closing) grammar
| [opening, closing] <- ["()", "[]", "{}"]]
isBalanced = isRight . parse (grammar >> eof) ""
isRight (Right _) = True
isRight _ = False
Run Code Online (Sandbox Code Playgroud)
ham*_*mar 18
正如Henning所说,解析器组合器可以为此工作.以下是使用Parsec的示例:
import Text.Parsec
grammar = many braces >> return ()
where braces = choice [ between (char '(') (char ')') grammar
, between (char '[') (char ']') grammar
, between (char '{') (char '}') grammar
]
isBalanced :: String -> Bool
isBalanced input = case parse (grammar >> eof) "" input of
Left _ -> False
Right _ -> True
Run Code Online (Sandbox Code Playgroud)
Mic*_*ele 10
import Data.List (foldl')
isBalanced xs = null $ foldl' op [] xs
where
op ('(':xs) ')' = xs
op ('[':xs) ']' = xs
op ('{':xs) '}' = xs
op xs x = x:xs
Run Code Online (Sandbox Code Playgroud)
折叠构建了一堆先前遇到的字符,在找到它们时剥离任何匹配.如果您最终得到一个空列表,则字符串是平衡的.
使用左折叠的缺点是必须始终扫描整个字符串.如果在没有匹配的开括号的情况下找到闭合支撑,那么中止失败的操作会很好.这是一个可以做到这一点的版本.
import Control.Monad (foldM)
isBalanced' xs = maybe False null $ foldM op [] xs
where
op ('(':xs) ')' = Just xs
op ('[':xs) ']' = Just xs
op ('{':xs) '}' = Just xs
op xs x | x `elem` ")]}" = Nothing
| otherwise = Just (x:xs)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3429 次 |
最近记录: |