使用镜头检查状态地图是否有钥匙的惯用方式是什么?这是我目前的尝试:
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!"
这可行,但是to isJust
部分感觉有些笨拙...
对于这种特殊情况,请保持简单,不要使用lens
:
present <- gets (member k)
如果仍然要使用lens
,例如您需要遍历某些字段进入状态以获得地图,请使用uses
:
present <- uses (field1.field2) (member k)
要根据uses
编写第一个动作,请使用身份光学元件id
:
present <- uses id (member k)
但是我不建议您免费这样做。