根据this question Haskell模式在每一行中必须具有相同数量的参数。这是我的功能:
{{1}}
考虑到开放式parantheses和一个字符串的数量,它应该找到关闭第一个的parantheses的索引。当我尝试加载这个函数时,我得到一个错误,说我已经在其模式的第1行和第3行声明了该函数。我每行有两个参数,所以这是什么原因?
答案 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