Haskell 构造相同的透镜
我正在尝试从另一个Haskell 构造相同的透镜,haskell,lenses,Haskell,Lenses,我正在尝试从另一个镜头获得的getter和setter创建镜头: 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) 但是,它失败了,出现了一个模糊的(对我来说)错误: 我做错了什么?这可能是一些非常基本的东西,但是,唉,我还不知道到底发生了什么(获取,访问器s),我自己来解释它。镜头中的视图类型要求参数镜头的类型为
镜头
获得的getter和setter创建镜头
:
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)
但是,它失败了,出现了一个模糊的(对我来说)错误:
我做错了什么?这可能是一些非常基本的东西,但是,唉,我还不知道到底发生了什么(
获取
,访问器
s),我自己来解释它。镜头中的视图
类型要求参数镜头
的类型为镜头s a
。
它不适用于常规类型镜头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
类型,这样代码也可以与镜头头一起工作(删除了Accessor
newtype)这对我来说很好(启用了Rank2:Types
语言pragma)。您是从文件加载模块,还是试图在repl中定义idL
?@ChrisTaylor:from file,启用Rank2Types
。如果有帮助的话,我也在使用lens-3.9.0.3和ghc-7.6.3。我也在GHCi中运行了这个,没有问题(尽管需要显式类型签名),我可以用lens-3.9.0.3和ghc-7.6.3复制这个。你们使用相同的版本吗?@RomanCheplyaka我有lens-3.9.0.3和ghc-7.6.1。。在GHCi和GHC btwIn中,哪个版本的镜头是简化的?我用的不是镜头3.9.0.2。在那个版本中有一种类型的视图::Lens's a
(注意“)。啊,有趣的是,我似乎把GHC弄糊涂了,使用了不正确的Lens版本。哎呀
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)