Haskell - 弄乱了括号字符的解析?

时间:2017-08-19 07:02:49

标签: haskell

根据this question Haskell模式在每一行中必须具有相同数量的参数。这是我的功能:

{{1}}

考虑到开放式parantheses和一个字符串的数量,它应该找到关闭第一个的parantheses的索引。当我尝试加载这个函数时,我得到一个错误,说我已经在其模式的第1行和第3行声明了该函数。我每行有两个参数,所以这是什么原因?

2 个答案:

答案 0 :(得分:4)

让我们在GHCi中加载代码:

> :{
| findNextParens :: Int -> String -> Int
| findNextParens 1 (')':str) = 1
| findnextParens n (c:str)   = 1 + findNextParens n str
| findNextParens n ('(':str) = 1 + findNextParens (n + 1) str
| findNextParens n (')':str) = 1 + findNextParens (n - 1) str
| :}

<interactive>:14:1: error: 
    Multiple declarations of ‘findNextParens’

多个声明?哦,第三行定义findnextParens而不是findNextParens,因此它被视为新函数的声明。

让我们解决这个错字:

> :{
| findNextParens :: Int -> String -> Int
| findNextParens 1 (')':str) = 1
| findNextParens n (c:str)   = 1 + findNextParens n str
| findNextParens n ('(':str) = 1 + findNextParens (n + 1) str
| findNextParens n (')':str) = 1 + findNextParens (n - 1) str
| :}

<interactive>:21:1: warning: [-Woverlapping-patterns]
    Pattern match is redundant
    In an equation for ‘findNextParens’:
        findNextParens n ('(' : str) = ...

<interactive>:22:1: warning: [-Woverlapping-patterns]
    Pattern match is redundant
    In an equation for ‘findNextParens’:
        findNextParens n (')' : str) = ...

啊,两个冗余(=无法访问)模式!

事实上,findNextParens n (c:str) = 1 + findNextParens n str行甚至可以捕获c是开放/封闭括号的情况,因此永远不会到达下一行。

摘要:编译代码时始终打开警告(-Wall)!

答案 1 :(得分:1)

第二行有一个小写n,但Haskell区分大小写。将其更改为:

findNextParens :: Int -> String -> Int
findNextParens 1 (')':str) = 1
findNextParens n (c:str)   = 1 + findNextParens n str
findNextParens n ('(':str) = 1 + findNextParens (n + 1) str
findNextParens n (')':str) = 1 + findNextParens (n - 1) str