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

标签 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 ()

最佳答案

NamedFieldPuns 扩展可以帮助解决这个问题。当对记录进行模式匹配时,它会绑定(bind)一个与记录字段同名的变量:

{-# LANGUAGE NamedFieldPuns #-}

baz :: (MonadState Qaax m) => m ()
baz = do
  Qaax {foo} <- get
  return ()

一个可能的问题是访问器被 do 的其余部分遮蔽。堵塞。

关于haskell - Haskell中字段值和本地范围之间的命名冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30540991/

相关文章:

c# - CA1500 与 SA1309 - 哪一个获胜?

haskell - 模式匹配变量的范围

haskell - 为什么 "map (filter fst)"的类型是 "[[(Bool, a)]] -> [[(Bool, a)]]"?

Git:在提交/推送之前通过过滤器运行?

c++ - 如何有效地构建具有多个菜单的终端应用程序?

delphi - 您遵循哪些 Delphi 编码标准文档?

c - Haskell FFi 与 c2hs : Better out-marshalling of structs

haskell - 减小 Snap 二进制文件的大小?

python - 为什么 python 在注释中使用非常规的三引号?

html - 一个以上的 html5 数据标签的正确命名约定是什么?