【问题标题】:How to compose lenses that return Maybe (Haskell)如何构图返回 Maybe 的镜头(Haskell)
【发布时间】:2016-04-17 23:00:12
【问题描述】:

假设我有一个像at _ 这样的镜头需要一些Maybe a

import Data.Map as M
m = M.fromList [(1,(2,3))]
--set 2nd element
m ^. at 1 .~ Just (4,5) 
--gives fromList [(1,(4,5))]
m ^. at 1 .~ Nothing
--gives fromList ()

现在假设我想用另一个镜头来构图。这个镜头返回一些Maybe a 的事实使我无法直接这样做。

m ^. at 1 . _2 .~ Just 4
--error
-- I want to get M.fromList [(1,(2,4))]

这样做的正确方法是什么?

【问题讨论】:

    标签: haskell haskell-lens lenses


    【解决方案1】:

    要设置一个值,你可以写:

    > m & ix 1 . _2 .~ 4
    fromList [(1,(2,4))]
    

    要获得一个值,你可以做类似的事情:

    > m ^? ix 1 . _2
    Just 3
    

    【讨论】:

      【解决方案2】:

      使用_Just 棱镜在 Map 中设置值,条件是键是否存在。这就是棱镜的用途!

      λ> let m = fromList [(1, (2, 3))]
      λ> m & at 1 . _Just . _2 .~ 4
      fromList [(1,(2,4))]
      λ> m & at 100 . _Just . _2 .~ 4
      fromList [(1,(2,3))]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-04
        • 2021-03-30
        • 2022-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-25
        相关资源
        最近更新 更多