这是一个编码风格的问题而不是技术问题。
我经常遇到一个问题,我使用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 ()
答案 0 :(得分:3)
添加'作为后缀是形成不同但相关名称的既定惯例。一个关键的例子是foldl
和foldl'
。
在像foldl'
这样的导出名称中,为“图书馆的意义”(通常是“更严格的版本”,如foldl'
)提出一致的主题通常是个好主意。但是在本地名称中你可以更自由地使用它“另一个与我有同名的东西”。
缺点是它不是非常不同,所以它会损害可读性;特别是如果你需要通常参考这两个版本。当你发现自己需要foo'''
时,你应该考虑一个不同的命名方案!
答案 1 :(得分:2)
NamedFieldPuns
扩展程序可以为此提供帮助。在记录上进行模式匹配时,它会绑定一个与记录字段同名的变量:
{-# LANGUAGE NamedFieldPuns #-}
baz :: (MonadState Qaax m) => m ()
baz = do
Qaax {foo} <- get
return ()
一个可能的问题是访问者被遮蔽了do
块的其余部分。