使用镜头检查有状态 map 是否有 key 的惯用方法是什么?这是我目前的尝试:
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
,例如需要通过一些字段遍历到state中才能得到map,使用uses
:
present <- uses (field1.field2) (member k)
要根据uses
编写第一个 Action ,请使用标识光学id
:
present <- uses id (member k)
但我不建议无缘无故地这样做。
关于haskell - 使用镜头测试 map 成员资格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62204759/