如何使用镜头库?

时间:2014-01-23 22:07:20

标签: haskell lens

在尝试与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}}但我不知道如何在状态上下文中这样做。

2 个答案:

答案 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")