用镜头获取价值s {b}

时间:2015-11-27 14:14:52

标签: haskell lens lenses

我想编写一个函数,在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

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

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

但是,以下编译:

f :: Getter s a -> s -> a
f l s = s ^. l

然后,我意识到在hierarchy of lens types中,Lens和Getter之间的箭头指定s = t,a = b。是否无法使用常规Lens s t a b从类型a的值中获取s类型的值?

2 个答案:

答案 0 :(得分:5)

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

f :: Lens s t a b -> s -> a 
f l s = getConst $ l Const s

如果您扩展Lensforall (f :: * -> *). Functor f => (a -> f b) -> s -> f t的定义,则最容易理解。

答案 1 :(得分:4)

有办法。

f :: Lens s t a b -> s -> a
f l s = getConst (l Const s)

这也正是(^.)的定义。我不确定为什么(^.)的类型以这种方式受到限制,可能只是为了简单起见。