haskell代码理解的问题

时间:2012-03-16 16:16:44

标签: haskell

是一名学生,刚开始使用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

1 个答案:

答案 0 :(得分:5)

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

check' x ('(':xs) = check' ('(':x) xs

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

check' ('(':x) (')':xs) = check' x xs

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

check' _ (')':xs) = False

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

check' _ []       = False

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