问题标签 [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 投票
3 回答
2085 浏览

haskell - 在没有 Monoid 实例的情况下,如何处理 Control.Lens.Indexed 中 at 的 Maybe 结果

我最近在 Hackage 上发现了 lens 包,并且现在一直在尝试在一个小型测试项目中使用它,如果我继续努力的话,在很遥远的一天可能会变成 M​​UD/MUSH 服务器。

这是我的代码的最小化版本,说明了我现在使用用于访问键/值容器的 at 镜头面临的问题(在我的情况下为 Data.Map.Strict)

由于房间、玩家和类似对象在整个代码中都被引用,因此我将它们存储在我的 World 状态类型中,作为其数据对象的 Id(新类型 UUID)映射。

要检索那些有镜头的人,我需要以某种方式处理 at 镜头返回的 Maybe (如果键不在地图中,这就是 Nothing)。在我的最后一行中,我尝试通过 traverse 执行此操作,只要最终结果是 Monoid 的实例,它就会进行类型检查,但通常情况并非如此。这不是因为 playerLocation 返回一个没有 Monoid 实例的 RoomId。

由于 traverse 只需要 Monoid,因为 traverse 泛化到大小大于 1 的容器,我现在想知道是否有更好的方法来处理这个问题,它不需要我想要的对象中可能包含的所有类型的语义上无意义的 Monoid 实例存储在地图中。

或者我可能完全误解了这里的问题,我需要使用一个完全不同的相当大的镜头包?

0 投票
1 回答
252 浏览

json - 记录的数据验证

您是否知道任何 Haskell 库

  1. 为记录验证和(!)提供了一些简化
  2. Aeson 合作

我知道我可以编写一些构造函数,但我想删除样板而不重新发明轮子。

我正在寻找的是以下内容:

我想为每个字段定义“合同”。例如:

现在,我想保证在我将 JSON 解析到记录中之后,以下内容成立:

  1. [0,Inf) 中的年龄
  2. 电子邮件匹配“^[A-Z0-9._%+-]+@[A-Z0-9.-]+.[AZ]{2,6}$”
  3. 项目至少包含 2 个项目

如果我尝试创建年龄 < 0 的记录,我将收到一条错误消息,例如“age=0 no in [0,inf)”。我认为应该可以通过模板 Haskell 派生这样的东西。

此外,我想将其集成到解析器阶段。因此,我不想收到一条错误消息,例如“当预期是一个 Integral,而是遇到了 String”,我想收到一条错误消息,

  1. 显示错误的位置(不确定 attoparsec 是否可行)
  2. 描述错误。
0 投票
1 回答
1349 浏览

haskell - 部分镜片的组成

我试图找出最简洁的方法来修改嵌套在Maybe类型(或其他用于建模偏爱的类型)中的值。

这是示例设置:

通过以下方式以有点混乱的方式很容易做到这一点lens

为了说明为什么这很讨厌,这就是我希望能够写的内容:

查找字段失败只会导致整个操作失败,而不是让我在可能发生的每个点显式检查失败。

有什么建议么?我试过浏览各种lens模块,但似乎没有什么能完全符合要求。

0 投票
1 回答
1169 浏览

performance - Control.Lens 是否有性能开销?

我很欣赏 Control.Lens 包。它确实有助于稍微弱一点的 Haskell 记录语法。我正在研究库的某些部分,其中性能是一个问题。有谁知道与函数中的基本模式匹配相比,使用通过如下所示的类型类公开的简单镜头会产生什么性能损失(如果有的话)?像这样使用 Lenses 有可能很好地解决记录命名空间冲突问题。我可以自己设置一些基准,但很好奇是否有人可以为我省去麻烦。谢谢。

镜头类

镜头实例

提供 Lenses 的模块不必导入 Control.Lens 包,非常棒。此页面https://github.com/ekmett/lens/描述了该库的使用。

0 投票
2 回答
2350 浏览

haskell - 带镜头和拉链的遍历树

我正在学习镜头包。我必须说这是一项相当具有挑战性的任务。

有人能告诉我如何用镜头的拉链穿过一棵树吗?特别是,我如何编写一个函数来获取根列表并允许我访问子树的分支?

假设我有这棵树。如果我的输入是[1, 3],该函数应该允许我访问节点 10 和 11。

此外,我究竟如何使用saveTaperestoreTape保存遍历路径(到 StateT 或 IORef)?

0 投票
2 回答
316 浏览

haskell - 使用镜头库组成部分吸气剂

我正在使用镜头包,并一直认为必须有一个简单的解决方案来解决以下问题。假设我At在其值类型上有一些地图(或任何实例)和一个镜头,即

我想要一个吸气剂

这是因为我经常想做这样的事情

当然,预期的语义是Just当您在at查找和Nothing其他情况下执行此操作时会获得一个值。

当一个人正在设置而不是让traverse作品代替时g,即

但不是当你得到。是否有一些我刚刚错过的内置镜头库,或者是否有另一种简单的方法可以在单个表达式中实现这一点?

0 投票
1 回答
338 浏览

haskell - 具有代数类型的镜头包

我正在使用镜头包进行编码。一切都很顺利,直到我尝试访问代数类型的某个字段:

我可以使用 _a,但我的实际程序中的数据类型要深得多,我打算使用镜头来减少我必须做的工作量。我一直在查看镜头库,但那里有很多东西,我不确定他是否处理过这种情况,或者这只是镜头库不支持的东西。

附带说明一下,如果我实际上使用像 String 这样的幺半群而不是 Char 作为数据类型,那么它会编译并给出正确的答案,我不知道为什么。

编辑:在阅读了 hammar 的评论后,我尝试了这个,这很有效:

但是对于必须存在的东西来说,从中获得一个可能有点奇怪。

0 投票
1 回答
576 浏览

haskell - 用镜头构造谓词

我想A -> Bool使用 A 的一些镜头创建一个函数。例如:

过滤谓词看起来有点笨拙。((>100).(^.foo))也好不到哪里去。如果没有镜头,我会使用((>100) . foo).

有没有一种很好的方法来创建这样的谓词lens?理想情况下,它还允许像(\a -> a^.foo > 100 && a^.bar < 50).

0 投票
2 回答
478 浏览

haskell - Haskell 的 lens 包如何处理也是关键字的字段?

镜头如何处理脱糖字段是关键字的情况?我似乎记得读过一些特别的东西,但我不记得我在哪里读到它或者“镜头”访问器的名称最终会是什么。

考虑以下:

将调用什么_type访问器以及如何避免在getType这里实现?

我不得不在哈斯克尔学校抨击这一点,因为我在这里无法访问适当的开发环境,但我认为它可能对其他人有用。当我可以进入 ghci 并做一个(如果给出答案)时,我会添加一个答案:browse,但同时有人知道吗?

结论

谢谢大家,makeLensesWith根据爱德华的建议,我将使用关键字到替换的映射。

0 投票
1 回答
1804 浏览

haskell - 使用 ekmett 的镜头更新一个字段的多个子字段

来玩个游戏。我们将使用两堆,都由黑/白边的芯片组成。

一个非常聪明的举动是在 A 堆中翻出黑色筹码,在 B 堆中翻出白色筹码。但是怎么做呢?

不是很优雅。如果不引用每个桩两次,我怎么能做到这一点?

我想出的唯一一件事(我不喜欢它):

(如果很明显,请提前抱歉 - 我对镜头有点陌生,我在组合器和操作员lens的报价中迷失了方向。可能每个人都需要的东西都藏在那里。当然不是说这很糟糕!但我希望有还包括完整的手册。)