问题标签 [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 回答
703 浏览

haskell - 协调镜头使用与数据库访问

我最近一直在玩镜头,发现它们的预期用途非常令人愉快——深入研究复杂的数据结构。但我最欣赏它们的领域之一是数据库访问(特别是 sqlite,但我认为我的问题适用于大多数数据库),但我看不出有任何方法可以编写不会严重牺牲的镜头性能或粒度。

如果我写一个镜头(或者我认为可能是一个棱镜,根据 NULLable 字段?)从数据库到表,从表到行,从行到列,每一步都会导致数据库访问,这意味着应该是一次访问至少是 4。

另一方面,如果我的目标是使用镜头/棱镜以 1:1 映射 DB 访问,那么当我只想查看哪些列是时,我会得到无法分解成更小的镜头的镜头在表中,依此类推。

将镜头与数据库一起使用是否有意义,如果是这样,我是否错过了一种明显的方法来避免重复工作以避免不必要的数据库访问?

0 投票
1 回答
334 浏览

haskell - 如何使用 Control.Lens 中的“over”但执行一元操作并收集结果?

问题很简单。我有一个看起来像这样的结构

我有一个镜头可以改变Item数据结构中 s 的内容,比如这个

这里的结构并不重要,我只是想展示一个使用棱镜和深度嵌套的例子。

现在的问题是我需要传递给的函数overString -> IO String,而不是仅仅String -> String。与我在这里寻找的类似的东西是类似的mapM,但带有镜头。有可能做这样的事情吗?

0 投票
1 回答
594 浏览

haskell - 如何使用 Lenses 将 IO 操作的结果与 `concat` 一起表达`mapM`?

我试图找出一种方法如何以允许以下方式traverseOf结合。>>=

TLDR;简单的 Haskell 中的一个简单示例是这样的,但在数据结构的深处使用镜头。

这是一个带有示例的冗长解释

现在最后一个例子是问题所在,因为我通过改变正在应用的函数来作弊。在concatReplace我能够使用>>=(感谢#haskell-lens频道上的乐于助人的人)来实现concatMap类似的功能。但在我的真实代码中,我拥有的功能是String -> IO [String],看起来像这样

但是这个例子不再进行类型检查。我需要的是基本上将逻辑放在一起,ioReplaceconcatReplace以一种我能够将具有该类型的函数应用String -> IO [String]到包含[String].

0 投票
3 回答
102 浏览

javascript - 合并两个不同形状的数据结构

我有两个不同形状的数据结构,它们来自两个不同的 API。数据为 JSON 格式,语言为 JavaScript。

阵列 1:

阵列 2:

数组 1 中工具提示字段的元素包含与数组 2 元素相同的“名称”。如何优雅地将数组 2 中的“状态”合并到数组 1 中的工具提示中?

我认为镜片可能是正确的答案,但我不确定,因为我从未使用过它们。

我知道我可以使用嵌套迭代和更新数组 1 来解决它。理想情况下,我正在寻找一种不会修改现有数据结构的方法。

0 投票
1 回答
1554 浏览

scala - 无形:由案例类别或领域参数化的通用镜头

基于:

我正在尝试制作一种镜头制作方法,例如:

但这似乎并不明显。有可能吗?

如果不是,我试图实现的最终结果是使用案例类内容更新嵌套 Maps 的通用方法,例如:

当由 T 和 f 参数化时,我无法让它工作。还有其他惯用的无样板解决方案吗?

谢谢!

0 投票
1 回答
113 浏览

haskell - 在状态计算中使用 Lens.Family.LensLike' 作为 setter 和 getter

我会在有状态计算中使用与 setter 和 getter 相同的镜头。而且 GHC 似乎无法推断出 Functor f 的共同类型。

所以我的问题是,是否有可能实现这种行为,或者我应该为 setter 和 getter 使用单独的镜头?谢谢!

0 投票
1 回答
527 浏览

scala - Scala中的不可变数据结构

我正在尝试实现一个不可变的数据结构来模拟 IT 网络和实例(计算机)。这是一个简化版本:

updateInstanceFlag 函数应该创建数据的更新副本,并修改相应的实例(id 为 instanceId)。我尝试使用镜头来实现这一点,但代码太复杂了。具体来说,我很难通过更新数据结构来通过 ID 定位实例或网络。从查询中返回可选值也增加了镜头的复杂性。我使用了自己的镜头实现,但没有真正的偏好(我知道 Shapeless、Monocle、Scalaz 的镜头实现)。

我很欣赏人们关于如何维护“真实”不可变数据的想法和经验。

谢谢。

0 投票
1 回答
526 浏览

haskell - 汇总 Haskell 记录列表

假设我有一个记录列表,我想通过取中位数来总结它。更具体地说,说我有

我有一个测量列表,我想把它总结成一个中位数Location,比如:

那很好,但是如果我有更多嵌套的东西怎么办,例如:

我有一个CampusLocations 列表,我想要一个 summary CampusLocation,其中中位数递归地应用于所有字段。

在 Haskell 中最干净的方法是什么?镜头?单板?

编辑:奖金:

如果我们想要汇总的不是包含字段的记录,而是一个隐式列表,该怎么办?例如:

假设每个的长度相同,我们如何将 a 总结[ComplexCampus]为 a ?ComplexCampusbuildings

0 投票
3 回答
946 浏览

haskell - Haskell 镜头:如何使视图与 traverse 配合得很好?

我正在尝试通过在 Haskell 中实现镜头来了解镜头。我已经实现了view组合器,如下所示:

但是,当我尝试将它与我一起使用时,traverse我收到以下错误消息:

不幸的是,我不明白这个错误信息。请解释它的含义以及我如何解决它。

0 投票
1 回答
1456 浏览

haskell - Clojure 中的 identity 函数和 Haskell 中的 id 函数有相同的用法和目的吗?

在 Clojure 中,我们有这个identity函数。它的使用如下

从我在 Haskell 中可以看到 -id 在使用镜头时使用,并在其他高阶函数中使用。

我的问题是(除了明显的类型系统差异) Clojure 中的函数是否与Haskellidentity中的函数具有相同的用途和目的?id

为什么我要问的是,当我查看Clojure中的以下镜头示例时- 我们看到定义为:Idfunctor

所以我觉得我错过了一些东西。