使用fwarn-name-shadowing进行可读性权衡

时间:2016-06-14 06:23:29

标签: haskell ghc

我最近启用了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}来避免隐藏remaindersections }和remainder',然后在嵌套的sections'子句中,我直接转到wherer以避免进一步的阴影 - 我想知道是否s在余额净正面。我认为我可以做一些重构来避免一些阴影,而不会引起这些尴尬名称的间接,但并不总是可能。

我最好允许一些阴影,或者我是否应该重新构建这样的例子以使气味消失?我怀疑后者,但我不确定。

1 个答案:

答案 0 :(得分:1)

很公平,我只是添加一个类似的问题,找到两个不同的名称是困难的。我仍然认为名字会让我们看到代码气味,并且必须首先考虑寻找不同的有意义的名字。