在Haskell中命名字段值和本地范围之间的冲突

Joh*_*ler 5 haskell coding-style naming-conventions

这是一个编码风格的问题而不是技术问题.

我经常遇到一个问题,我使用haskell(不太理想)的记录语法(或镜头,问题最终相同)来创建一个data类型.我最终得到了以我的字段命名的字段访问器函数.作为一名尽职尽责的程序员,我试图使我的记录字段名称有意义.

稍后我需要从我的类型中获取一个字段并将其值保存在局部变量中.这通常在do块中的StateMonad中完成.问题是我称之为局部变量.最明显的名称已被视为字段访问者.我发现我的自我使用缩写,这往往会使我的代码可读性降低.

是否存在解决此问题的Haskell编码约定?

data Qaax = Qaax {
      foo :: SomeFoo
    , bar :: SomeBar
    , ...
    }

baz :: (MonadState Qaax m) => (...) -> m ()
baz (...) = do
  f <- gets foo -- I'd really like to use something more descriptive then
                -- `f` but `foo` is already taken.
  ...
  return ()
Run Code Online (Sandbox Code Playgroud)

Ben*_*Ben 3

添加 ' 作为后缀是形成不同但相关的名称的既定惯例。一个关键的例子是foldlfoldl'

在导出的名称中foldl',通常最好为 ' 对您的库的含义提出一致的主题(通常是“更严格的版本”,如 中所示foldl')。但在本地名称中,您可以更自由地使用它“我希望与另一个密切相关的事物具有相同的名称”。

缺点是它不太明显,因此会损害可读性;特别是当您需要共同引用这两个版本时。当您发现自己需要时,foo'''您可能应该考虑不同的命名方案!