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