繁体   English   中英

在Haskell中使用Lens来修改值

[英]Using Lens in Haskell to modify values

我经常发现自己使用这种模式:

do
    let oldHeaders = mail ^. headers
    put $ (headers .~ (insert header value oldHeaders)) mail

这看起来像Control.Lens应该能做的事情,但我想我还没有找到合适的操作员。 有没有更好的办法? 另外,在这段代码中我还应该做些什么吗?

您可以使用Lens es和Traversal链直接访问内部标头值并更新它。

put $ mail & headers . at header ?~ value

请注意, (?~)只是\\lens value -> lens .~ Just value简写\\lens value -> lens .~ Just value Just需,以指示at镜头我们要插入一个值,如果不存在的话。

如果第一行中的mail来自状态monad,就像这样

do
  mail <- get
  let oldHeaders = mail ^. headers
  put $ (headers .~ (insert header value oldHeaders)) mail

然后使用modify :: MonadState sm => (s -> s) -> m ()来编写它更简单

modify (headers . at header ?~ value)

正如ØrjanJohansen在评论中所建议的那样,可以写成最简洁的

headers . at header ?= value

你通常不会需要getput在明确State使用镜头时单子。 在您的情况下,您可以使用运算符?=直接更新状态:

example = do
  headers . at header ?= value

您还可以使用%=修改任何具有功能的镜头:

example2 = do
  headers %= insert header value

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM