2

我正在尝试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这可能是非常基本的东西,但是,唉,我对真正发生的事情 ( , s)的了解还不够,无法Accessor自己解开它。

4

1 回答 1

2

viewin lens的类型要求参数Lens是 type Lens s s a a。它不适用于一般类型Lens s t a b。这样做的原因是,如果类型view是泛化的,您将需要编写许多类型签名。

但是你可以做 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

于 2013-10-10T18:05:22.203 回答