在有状态计算中,我会使用相同的镜头作为设置器和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因此,我的问题是,是否有可能实现这样的行为,或者我应该使用单独的镜头设置和吸气?谢谢!
发布于 2014-08-07 14:12:46
这里有几个选择。首先,您可以使用RankNTypes,这样每个“调用站点”都可以使用不同的函子实例,接下来您可以使用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。身份函子用于设置,Const函子用于获取。
https://stackoverflow.com/questions/25184290
复制相似问题