Haskell 使用Lens.Family.LensLike';作为状态计算中的setter和getter

Haskell 使用Lens.Family.LensLike';作为状态计算中的setter和getter,haskell,lenses,Haskell,Lenses,在有状态计算中,我希望使用与setter和getter相同的镜头。 GHC似乎无法推导出函子f的公共类型 import Lens.Family import Lens.Family.State import Control.Monad.State -- | Run computation inside modified state with :: Functor f => LensLike' f s a -> a -> State s b -> State s b wi

在有状态计算中,我希望使用与setter和getter相同的镜头。 GHC似乎无法推导出函子f的公共类型

import Lens.Family
import Lens.Family.State
import Control.Monad.State

-- | Run computation inside modified state
with :: Functor f => LensLike' f s a -> a -> State s b -> State s b
with lens value comp = do
  value' <- use lens
  lens .= value
  res <- comp
  lens .= value'
  return res
import Lens.Family
导入Lens.Family.State
进口控制单体状态
--|在修改状态内运行计算
with::Functor f=>LensLike'fsa->a->stateb->stateb
镜头值comp=do时

值“这里有两个选项。首先,您可以使用RankNTypes,以便在每个“调用站点”使用不同的Functor实例,然后您可以使用LensLike'作为getter和setter:

with :: (forall f. Functor f => LensLike' f s a) -> a -> State s b -> State s b
第二种可能更好的方法是使用
Lens'
类型,该类型已经存在——允许同时用作getter和setter

with :: Lens' s a -> a -> State s b -> State s b
您必须允许函子从“调用站点”到调用站点有所不同,因为选择一个特定的函子将镜头更改为getter或setter。标识函子用于设置,常量函子用于获取