构建一个相同的镜头

时间:2013-10-10 16:20:49

标签: haskell lenses

我正在尝试使用另一个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'

我做错了什么?这可能是一些非常基本的东西,但是,唉,我还不太了解真正发生的事情(GettingAccessor s)自己解开它。

1 个答案:

答案 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新类型)