我最近启用了GHC的-Wall
选项,其中包括-fwarn-name-shadowing
。提供的理由是:
只要内部范围值与外部范围值具有相同的名称(即内部值隐藏外部值),此选项就会发出警告。这可以捕获印刷错误,这些错误会变成难以发现的错误。
但是在实践中我还没有发现任何错误,但是我已经使我的函数中的变量命名更加难以解决它。缩写示例:
-- General method for parsing a paragraph.
paragraph :: Parser Node
paragraph = undefined -- omitted for brevity
blockquote :: Parser Node
blockquote = lookAhead (char '>')
>> Blockquote
<$> paragraph' `sepBy1` blankLine
where
-- Avoid shadowing a `paragraph` method defined above.
-- This one is more specialized and relevant only in
-- this context.
paragraph' = Paragraph <$> body
这对我来说似乎有点臭,但我还有其他更糟糕的情况 - 例如我有一个功能,我最终通过使用{{1}来避免隐藏remainder
和sections
}和remainder'
,然后在嵌套的sections'
子句中,我直接转到where
和r
以避免进一步的阴影 - 我想知道是否s
在余额净正面。我认为我可以做一些重构来避免一些阴影,而不会引起这些尴尬名称的间接,但并不总是可能。
我最好允许一些阴影,或者我是否应该重新构建这样的例子以使气味消失?我怀疑后者,但我不确定。
答案 0 :(得分:1)
很公平,我只是添加一个类似的问题,找到两个不同的名称是困难的。我仍然认为名字会让我们看到代码气味,并且必须首先考虑寻找不同的有意义的名字。