我正在尝试使用另一个Lens
从getter和setter创建Lens
:
import Control.Lens
idL :: Lens s t a b -> Lens s t a b
idL l = lens (\s -> view l s) (\s b -> set l b s)
然而,它失败了一个模糊的(对我来说)错误:
Expected type: Getting a s a
Actual type: (a -> Accessor a b) -> s -> Accessor a t
In the first argument of `view', namely `l'
我做错了什么?这可能是一些非常基本的东西,但是,唉,我还不太了解真正发生的事情(Getting
,Accessor
s)自己解开它。
答案 0 :(得分:2)
镜头中view
的类型要求参数Lens
属于Lens s s a a
类型。
它不适用于常规类型Lens s t a b
。这样做的原因是,如果view
的类型被推广,则需要编写许多类型签名。
但你可以只做视图而不限制类型:
import Control.Lens
import Control.Applicative -- This imports Const
idL :: Lens s t a b -> Lens s t a b
idL l = lens (\s -> getConst $ l Const s) (\s b -> set l b s)
我使用Const
代替Accessor
类型,因此代码也适用于镜头HEAD(删除了Accessor
新类型)