是一名学生,刚开始使用Haskell并且部分代码存在问题。我不明白这段代码是如何工作的。任何人都可以解释我的工作原理吗?
check :: String -> Bool
check = check' [] where
check' [] [] = True
check' _ [] = False
check' x ('(':xs) = check' ('(':x) xs
check' ('(':x) (')':xs) = check' x xs
check' _ (')':xs) = False
check' x (_ :xs) = check' x xs
答案 0 :(得分:5)
check'
函数的第一个参数用作堆栈来计算打开的括号。每次遇到一个左括号时,它会将它附加到堆栈并继续输入行的其余部分:
check' x ('(':xs) = check' ('(':x) xs
然后,当它遇到一个右括号时,会弹出一个左括号并继续:
check' ('(':x) (')':xs) = check' x xs
但是如果有一个右括号并且堆栈中没有剩余的那个,它就会失败:
check' _ (')':xs) = False
此外,如果线路结束,并且未关闭的括号仍然存在,则失败:
check' _ [] = False
默认情况下,堆栈为空。其余的是明显的边界情况。