3

在尝试使用 Edwards图书馆时,我再次感到困惑。lens我尝试snoc在状态上下文中将一些东西放在向量的末尾:

data Foo = Foo {
  _vec :: Vector Int
}

makeLenses ''Foo

testCons x = vec <>= singleton x

虽然这可行,但我想使用[cons][2],但我不知道如何使用。文档提到[0,1,2] |> 3 === [0,1,2,3]但我不知道如何在状态上下文中执行此操作。

4

2 回答 2

3

(%=) 组合器可让您将函数应用于镜头的目标;你想要类似的东西

stateSnoc :: MonadState Foo m => Int -> m ()
stateSnoc x = vec %= (|> x)
于 2014-01-23T22:39:37.943 回答
1

snoc似乎是为方便起见从原始定义的普通函数Prism,即_Snoc.

那么为什么不使用一个普通的MonadState函数呢,比如modify

runState (modify $ flip snoc 'a') ['b']
-- ((),"ba")
于 2014-01-23T22:46:45.490 回答