使用镜头测试地图成员资格

Art*_*rim 3 haskell haskell-lens

使用镜头检查有状态地图是否有键的惯用方法是什么?这是我目前的尝试:

module Foo where

import Control.Lens
import Data.Map
import Control.Monad.State
import Data.Maybe (isJust)

check :: Int -> StateT (Map Int Int) IO ()
check k = do
  present <- use $ at k.to isJust
  unless present $ lift $ putStrLn "Not present!"
Run Code Online (Sandbox Code Playgroud)

这有效,但该to isJust部分感觉有点笨重......

HTN*_*TNW 5

对于这种特殊情况,请保持简单,不要使用lens

present <- gets (member k)
Run Code Online (Sandbox Code Playgroud)

如果您lens无论如何都要使用,例如您需要通过某些字段遍历状态以获取地图,请使用uses

present <- uses (field1.field2) (member k)
Run Code Online (Sandbox Code Playgroud)

要根据 编写第一个操作uses,请使用标识光学id

present <- uses id (member k)
Run Code Online (Sandbox Code Playgroud)

但我不建议无缘无故地这样做。