首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在状态计算中使用Lens.Family.LensLike‘作为setter和getter

在状态计算中使用Lens.Family.LensLike‘作为setter和getter
EN

Stack Overflow用户
提问于 2014-08-07 13:48:27
回答 1查看 120关注 0票数 3

在有状态计算中,我会使用相同的镜头作为设置器和getter。GHC似乎无法推导出函子f的一般类型。

代码语言:javascript
复制
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

因此,我的问题是,是否有可能实现这样的行为,或者我应该使用单独的镜头设置和吸气?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-07 14:12:46

这里有几个选择。首先,您可以使用RankNTypes,这样每个“调用站点”都可以使用不同的函子实例,接下来您可以使用LensLike‘作为getter和setter:

代码语言:javascript
复制
with :: (forall f. Functor f => LensLike' f s a) -> a -> State s b -> State s b

其次,也许更好的做法是使用已经存在的Lens'类型--允许同时作为getter和setter使用。

代码语言:javascript
复制
with :: Lens' s a -> a -> State s b -> State s b

您必须允许函子从“调用站点”更改为“调用站点”,因为选择特定的函子可以将透镜转换为getter或setter。身份函子用于设置,Const函子用于获取。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25184290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档