Haskell中字段值和局部范围之间的命名冲突

Haskell中字段值和局部范围之间的命名冲突,haskell,coding-style,naming-conventions,Haskell,Coding Style,Naming Conventions,这是一个编码风格的问题,而不是一个技术问题 我经常遇到一个问题,我使用haskell的(不太理想的)记录语法(或者镜头,问题最终也是一样)来创建数据类型。我最终得到了以我的字段命名的字段访问器函数。作为一个有责任心的程序员,我努力使我的记录字段名有意义 稍后,我需要从我的类型中获取一个字段,并将其值保留在局部变量中。这通常在do块中的StateMonad内完成。问题是我怎么称呼局部变量。最明显的名称已被用作字段访问器。我发现我自己使用的缩写往往使我的代码不那么可读 是否存在解决此问题的Haske

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

我经常遇到一个问题,我使用haskell的(不太理想的)记录语法(或者镜头,问题最终也是一样)来创建
数据
类型。我最终得到了以我的字段命名的字段访问器函数。作为一个有责任心的程序员,我努力使我的记录字段名有意义

稍后,我需要从我的类型中获取一个字段,并将其值保留在局部变量中。这通常在
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 ()
data Qaax=Qaax{
foo::SomeFoo
,bar::SomeBar
, ...
}
baz::(MonadState Qaax m)=>(…)->m()
baz(…)=do
f伸展可以帮助解决这个问题。在记录上进行模式匹配时,它会绑定一个与记录字段同名的变量:

{-# LANGUAGE NamedFieldPuns #-}

baz :: (MonadState Qaax m) => m ()
baz = do
  Qaax {foo} <- get
  return ()
{-#语言名称字段puns}
baz::(MonadState Qaax m)=>m()
baz=do

Qaax{foo}添加“作为后缀是形成不同但相关名称的既定惯例。一个关键的例子是
foldl
foldl'

在导出的名称中,如
foldl'
,为“对您的库意味着什么”想出一个一致的主题通常是一个好主意(通常是“更严格的版本”,如
foldl'
)。但在本地名称中,你可以更自由地使用它“另一个密切相关的东西,我希望与之同名”

缺点是它不是很清晰,所以它会损害可读性;尤其是当您需要经常引用这两个版本时。当您发现自己需要
foo'
时,您可能应该考虑一种不同的命名方案