我想编写一个函数,在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):
但是,以下编译:
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
类型的值?
答案 0 :(得分:5)
使用^.
的问题不是its implementation,而是其类型签名。如果我们解除其定义,我们可以将其用于f
:
f :: Lens s t a b -> s -> a
f l s = getConst $ l Const s
如果您扩展Lens
:forall (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)
这也正是(^.)
的定义。我不确定为什么(^.)
的类型以这种方式受到限制,可能只是为了简单起见。