haskell代码理解的问题

use*_*744 0 haskell

'ma student,刚刚开始使用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
Run Code Online (Sandbox Code Playgroud)

ber*_*eal 5

check'函数的第一个参数用作堆栈来计算打开的括号.每次遇到一个左括号时,它会将它附加到堆栈并继续输入行的其余部分:

check' x ('(':xs) = check' ('(':x) xs
Run Code Online (Sandbox Code Playgroud)

然后,当它遇到一个右括号时,它会弹出一个左括号并继续:

check' ('(':x) (')':xs) = check' x xs
Run Code Online (Sandbox Code Playgroud)

但是如果有一个右括号并且堆栈中没有剩余的那个,它就会失败:

check' _ (')':xs) = False
Run Code Online (Sandbox Code Playgroud)

此外,如果线路结束,并且未关闭的括号仍然存在,则失败:

check' _ []       = False
Run Code Online (Sandbox Code Playgroud)

默认情况下,堆栈为空.其余的是明显的边界情况.