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