lens(のMonadState演算子など)で自己に言及したい時はidを使う
まとめ
lensにて。
例えばInt
や[Int]
のような単一の状態を持つMonadState
の文脈で、
状態自身(自己)に言及したい場合は、このようにすることで実現できる。
import Control.Lens
import Control.Monad.State.Lazy (StateT, runStateT)
main :: IO ()
main = runStateT context [0] >>= print
-- dequeue behavior
context :: StateT [Int] IO ()
context = do
id %= (10 <|)
id %= (|> 20)
-- {output}
-- ((),[10,0,20])
infix 4 %=
(%=) :: MonadState s m => ASetter s s a b -> (a -> b) -> m ()
(%=) :: ASetter s s a b -> (a -> b) -> StateT s m ()
(%=) :: ASetter' s a -> (a -> a) -> StateT s m ()
(%=) :: ASetter' [Int] [Int] -> ([Int] -> [Int]) -> StateT [Int] IO ()
(<|) :: a -> Seq a -> Seq a
(|>) :: Seq a -> a -> Seq a
(10 <|) :: Seq a -> Seq a
(|> 20) :: Seq a -> Seq a
type ASetter' s a = ASetter s s a a
type ASetter s t a b = (a -> Identity b) -> s -> Identity t
id :: p s (f a) -> p s (f a)
id :: (s -> f a) -> s -> f a
id :: (s -> Identity a) -> s -> Identity a
id :: ASetter' s a
id :: ASetter' [Int] [Int]
-- なので
(id %=) :: ([Int] -> [Int]) -> StateT [Int] IO ()
ちなみにControl.Lens.Equality
のsimple :: Equality' a a
の実定義はid
。