问题标签 [lenses]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
619 浏览

scala - 基于 Scala 类型的属性提取器 - 仅吸气剂镜头?

从数据容器(例如案例类)中提取类型的最佳方法是什么。

例如,如果我有一个type Tagged[U] = { type Tag = U}标记类型trait PID,它是标记的 Inttype ProductId = Int with Tagged[PID]或 scalaz 样式type ProductId = Int @@ PID,并说产品中的其他字段type Name = String @@ PName等,以及一个包含产品属性的数据容器;

我怎样才能编写一个通用的提取器A => B样式方法而不求助于反射?

原因是我想在运行时从 Product 容器中动态提取一个字段。即用户传入他们想要提取的产品的属性。

即,如果我想动态获取ProductId,我可以编写一个采用类型并返回值的方法,例如

还是我把事情复杂化了。

我可以编写简单的提取器类,它采用 A => B 函数并为每种类型定义它;

然后在需要的地方添加它们。

但这似乎很麻烦。

我觉得 Lens 之类的东西在这里会很有用。

0 投票
1 回答
569 浏览

scala - Scala递归宏?

我想知道 Scala 是否支持递归宏扩展,例如我正在尝试编写一个带有镜头宏的镜头库来执行此操作:

鉴于lens(a)(_.b.c.d)(f),我想将其转换为a.copy(b = lens(a.b)(_.c.d)(f))

编辑: 我在这里取得了一些不错的进展

List[TermName]但是,对于上面的示例,我无法找出创建访问器的通用方法,因为我有List(TermName('b'), TermName('c'), TermName('d'))),我想生成一个匿名函数,_.b.c.d(x: A) => x.b.c.d。我怎么做?

基本上,我怎样才能以通用的方式编写这些行?

0 投票
1 回答
677 浏览

haskell - 如何实现 Haskell 的“使用函数组合来组合镜头”具有奇怪的参数顺序?

我一直在阅读A wreq 教程

镜头提供了一种关注 Haskell 值的一部分的方法。比如Responsetype有一个responseStatuslens,重点关注服务端返回的状态信息。

^.运算符将一个值作为其第一个参数,将一个镜头作为其第二个参数,并返回镜头聚焦的值部分。

我们使用函数组合来组合镜头,这使我们能够轻松地专注于深度嵌套结构的一部分。

我想不出一种方法,如何使用这种参数顺序完成的函数组合可以按该顺序处理嵌套结构。

看:r ^. responseStatus . statusCode可能是r ^. (responseStatus . statusCode)(r ^. responseStatus) . statusCode

在第一个中说我们构造了一个函数,它首先处理statusCode(从记录中获取它Status? - 正如我可以从显示的值中推断出来的那样Status {statusCode = 200, statusMessage = "OK"}),然后将它传递给responseStatus必须处理响应状态的函数。所以,反过来说:实际上,状态码是响应状态的一部分。

第二次阅读对我来说也没有意义,因为它也首先处理状态代码。

0 投票
1 回答
161 浏览

haskell - 对具有约束的数据进行 makeLenses (DatatypeContexts)

我可以在makeLenses具有约束的数据类型上使用模板吗?如果可以,如何使用?我想这样做而不阅读有关Template Haskell的所有内容。

在 GHC 我有这个例子:

这会产生这个编译错误:

所以我认为它产生了:

我也试过makeFieldsand makeClassy,无济于事。

我知道我可以解决这个问题:

但是有没有办法使用makeLenses或 Template Haskell 来做到这一点?

我正在使用 GHC 7.8.4lens版和 4.8 版。

(注意:我知道关于 makeLenses 有类似的问题,但我仍然无法让它工作。我是 haskell 的初学者。)

0 投票
0 回答
1076 浏览

ocaml - 偷窥镜头和CPS超过价值限制

在 OCaml 中编码一种 van Laarhoven 镜头,但由于价值限制而遇到困难。

相关代码如下:

在这里,我将镜头表示为更高阶的类型,即 CPS 转换函数的转换器(如此('a -> 'b) -> ('s -> 't)处所建议和所讨论)。函数,和都具有完全泛化的类型,但它们的组合没有。lensfstbuildlens fst build

如要点所示,完全可以编写_1

但是每次都必须手动构建这些镜头很乏味,使用高阶函数(如lens.

有什么办法可以绕过这里的价值限制吗?

0 投票
1 回答
153 浏览

haskell - 为列表创建一个镜头(喜欢)

我正在尝试为以下数据结构创建镜头。我正在使用lens-family.

出于各种原因,我想避免使用 Template Haskell。一方面,它似乎不适用于我的 ghc 版本(7.8.3),这是另一个(超出范围)问题。

为唱片制作镜头并不难。

但似乎 lens-family 没有列表的默认镜头。我认为这是可能的。有为lens。这些是我失败的尝试:

他们都得到一个类似于这个的错误:

如何定义_last镜头?

编辑:这是一个构建的版本:

虽然,正如大卫/丹尼尔指出的那样,_last应该是一个遍历,而不是一个镜头。

0 投票
2 回答
1341 浏览

haskell - Could someone explain the diagram about the `lens` library?

If you browse through Lens entry on hackage, Lens Github's repo, or even google about Lens, you will find a lot of partial references such as introductory tutorials/videos, examples, overviews and so on. Since I already know most of the basics, I am looking for a more complete reference that would help me to get more knowledge about the advanced features. In other words, I still have no idea what this means and couldn't find a resource complete enough to explain this graphic as a whole. Ideas?

0 投票
1 回答
133 浏览

haskell - 弄乱镜头时输入错误

尝试编译某些镜头代码时遇到类型错误。

错误是:

如果我直接使用 ilL,这个错误就会消失。但是,我确实需要使用 let 进行镜头定义。我该如何解决这个问题?

0 投票
2 回答
1025 浏览

haskell - 如何使用 Lenses 遍历并分配给 Map 中的某些(但不是全部)元素

我一直在尝试使用镜头和容器并取得了一些成功,但我在尝试使用 Data.Map 的过滤遍历时遇到了我的理解限制 - 我可以更改地图中的单个实例或遍历所有实例,但我不能弄清楚如何对一些可识别的分区(即范围内的键)进行操作。

本质上,我正在尝试对地图做一些类似于 Gabriel Gonzalez 优秀镜头教程对列表所做的事情 [1]

这是我的代码的工作框架,traverseSome其中我不知道如何编写注释掉的函数。任何帮助都感激不尽!

[1] http://www.haskellforall.com/2013/05/program-imperatively-using-haskell.html

0 投票
1 回答
218 浏览

scala - Scalaz 镜头到 ReaderWriterState

给定,说

我该如何想出:

在利用ageL镜头的同时。Scalaz Lens 有一些实用程序可以State从.LensReaderWriterState