用镜头刺伤获得价值

Gui*_*rel 4 haskell lenses haskell-lens

我想编写一个函数,在Lens stab的帮助下将函数(a - > b)转换为函数(s - > t)(编辑:我意识到这个函数已经存在Setter s t a b并且被称为over或者%~,但是它没有回答下面使用镜头获取值的问题).看起来很简单,但我遇到了一个令人困惑的类型错误.要创建一个更小的示例,请考虑以下函数,它只返回镜头从第二个参数中提取的值:

f :: Lens s t a b -> s -> a
f l s = s ^. l
Run Code Online (Sandbox Code Playgroud)

这不编译.在^的第二个参数中有2个错误.(即l):

  • 无法将类型't'与's'匹配
  • 无法将类型'a'与'b'匹配

但是,以下编译:

f :: Getter s a -> s -> a
f l s = s ^. l
Run Code Online (Sandbox Code Playgroud)

然后,我意识到在镜头类型层次结构中,Lens和Getter之间的箭头指定s = t,a = b.有没有办法使用常规从Lens s t a b类型a的值中获取类型的值s

ram*_*ion 5

使用的问题^.不是它的实现,而是它的类型签名.如果我们解除其定义,我们可以将其用于f:

f :: Lens s t a b -> s -> a 
f l s = getConst $ l Const s
Run Code Online (Sandbox Code Playgroud)

如果扩展以下定义,则最容易理解Lens:forall (f :: * -> *). Functor f => (a -> f b) -> s -> f t.