Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 构造相同的透镜_Haskell_Lenses - Fatal编程技术网

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)