在尝试与Edwards lens
库合作时,我感到难过again。我尝试在状态上下文中的向量的末尾snoc
:
data Foo = Foo {
_vec :: Vector Int
}
makeLenses ''Foo
testCons x = vec <>= singleton x
虽然这有效但我想使用[cons][2]
,但我不知道如何使用[0,1,2] |> 3 === [0,1,2,3]
。文档提到{{1}}但我不知道如何在状态上下文中这样做。
答案 0 :(得分:3)
(%=)组合器允许您将函数应用于镜头的目标;你想要像
这样的东西stateSnoc :: MonadState Foo m => Int -> m ()
stateSnoc x = vec %= (|> x)
答案 1 :(得分:1)
snoc
似乎是一个简单的函数,为了方便起见,从原Prism
开始,_Snoc
。
那么为什么不使用普通的MonadState
函数,例如modify
?
runState (modify $ flip snoc 'a') ['b']
-- ((),"ba")