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.Equalitysimple :: Equality' a aの実定義はid

参考

Thanks

筆者プロフィール

my-latest-logo

aiya000(あいや)

せつラボ 〜圏論の基本〜」 「せつラボ2~雲と天使と関手圏~」 「矢澤にこ先輩といっしょに代数!」を書いています!

強い静的型付けとテストを用いて、バグを防ぐのが好き。Haskell・TypeScript。