Haskell 使用Lens.Family.LensLike';作为状态计算中的setter和getter
在有状态计算中,我希望使用与setter和getter相同的镜头。 GHC似乎无法推导出函子f的公共类型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
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。标识函子用于设置,常量函子用于获取