问题标签 [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.
haskell - 在没有 Monoid 实例的情况下,如何处理 Control.Lens.Indexed 中 at 的 Maybe 结果
我最近在 Hackage 上发现了 lens 包,并且现在一直在尝试在一个小型测试项目中使用它,如果我继续努力的话,在很遥远的一天可能会变成 MUD/MUSH 服务器。
这是我的代码的最小化版本,说明了我现在使用用于访问键/值容器的 at 镜头面临的问题(在我的情况下为 Data.Map.Strict)
由于房间、玩家和类似对象在整个代码中都被引用,因此我将它们存储在我的 World 状态类型中,作为其数据对象的 Id(新类型 UUID)映射。
要检索那些有镜头的人,我需要以某种方式处理 at 镜头返回的 Maybe (如果键不在地图中,这就是 Nothing)。在我的最后一行中,我尝试通过 traverse 执行此操作,只要最终结果是 Monoid 的实例,它就会进行类型检查,但通常情况并非如此。这不是因为 playerLocation 返回一个没有 Monoid 实例的 RoomId。
由于 traverse 只需要 Monoid,因为 traverse 泛化到大小大于 1 的容器,我现在想知道是否有更好的方法来处理这个问题,它不需要我想要的对象中可能包含的所有类型的语义上无意义的 Monoid 实例存储在地图中。
或者我可能完全误解了这里的问题,我需要使用一个完全不同的相当大的镜头包?
json - 记录的数据验证
您是否知道任何 Haskell 库
- 为记录验证和(!)提供了一些简化
- 与Aeson 合作?
我知道我可以编写一些构造函数,但我想删除样板而不重新发明轮子。
我正在寻找的是以下内容:
我想为每个字段定义“合同”。例如:
现在,我想保证在我将 JSON 解析到记录中之后,以下内容成立:
- [0,Inf) 中的年龄
- 电子邮件匹配“^[A-Z0-9._%+-]+@[A-Z0-9.-]+.[AZ]{2,6}$”
- 项目至少包含 2 个项目
如果我尝试创建年龄 < 0 的记录,我将收到一条错误消息,例如“age=0 no in [0,inf)”。我认为应该可以通过模板 Haskell 派生这样的东西。
此外,我想将其集成到解析器阶段。因此,我不想收到一条错误消息,例如“当预期是一个 Integral,而是遇到了 String”,我想收到一条错误消息,
- 显示错误的位置(不确定 attoparsec 是否可行)
- 描述错误。
haskell - 部分镜片的组成
我试图找出最简洁的方法来修改嵌套在Maybe
类型(或其他用于建模偏爱的类型)中的值。
这是示例设置:
通过以下方式以有点混乱的方式很容易做到这一点lens
:
为了说明为什么这很讨厌,这就是我希望能够写的内容:
查找字段失败只会导致整个操作失败,而不是让我在可能发生的每个点显式检查失败。
有什么建议么?我试过浏览各种lens
模块,但似乎没有什么能完全符合要求。
performance - Control.Lens 是否有性能开销?
我很欣赏 Control.Lens 包。它确实有助于稍微弱一点的 Haskell 记录语法。我正在研究库的某些部分,其中性能是一个问题。有谁知道与函数中的基本模式匹配相比,使用通过如下所示的类型类公开的简单镜头会产生什么性能损失(如果有的话)?像这样使用 Lenses 有可能很好地解决记录命名空间冲突问题。我可以自己设置一些基准,但很好奇是否有人可以为我省去麻烦。谢谢。
镜头类
镜头实例
提供 Lenses 的模块不必导入 Control.Lens 包,非常棒。此页面https://github.com/ekmett/lens/描述了该库的使用。
haskell - 带镜头和拉链的遍历树
我正在学习镜头包。我必须说这是一项相当具有挑战性的任务。
有人能告诉我如何用镜头的拉链穿过一棵树吗?特别是,我如何编写一个函数来获取根列表并允许我访问子树的分支?
假设我有这棵树。如果我的输入是[1, 3]
,该函数应该允许我访问节点 10 和 11。
此外,我究竟如何使用saveTape
和restoreTape
保存遍历路径(到 StateT 或 IORef)?
haskell - 使用镜头库组成部分吸气剂
我正在使用镜头包,并一直认为必须有一个简单的解决方案来解决以下问题。假设我At
在其值类型上有一些地图(或任何实例)和一个镜头,即
我想要一个吸气剂
这是因为我经常想做这样的事情
当然,预期的语义是Just
当您在at
查找和Nothing
其他情况下执行此操作时会获得一个值。
当一个人正在设置而不是让traverse
作品代替时g
,即
但不是当你得到。是否有一些我刚刚错过的内置镜头库,或者是否有另一种简单的方法可以在单个表达式中实现这一点?
haskell - 具有代数类型的镜头包
我正在使用镜头包进行编码。一切都很顺利,直到我尝试访问代数类型的某个字段:
我可以使用 _a,但我的实际程序中的数据类型要深得多,我打算使用镜头来减少我必须做的工作量。我一直在查看镜头库,但那里有很多东西,我不确定他是否处理过这种情况,或者这只是镜头库不支持的东西。
附带说明一下,如果我实际上使用像 String 这样的幺半群而不是 Char 作为数据类型,那么它会编译并给出正确的答案,我不知道为什么。
编辑:在阅读了 hammar 的评论后,我尝试了这个,这很有效:
但是对于必须存在的东西来说,从中获得一个可能有点奇怪。
haskell - 用镜头构造谓词
我想A -> Bool
使用 A 的一些镜头创建一个函数。例如:
过滤谓词看起来有点笨拙。((>100).(^.foo))
也好不到哪里去。如果没有镜头,我会使用((>100) . foo)
.
有没有一种很好的方法来创建这样的谓词lens
?理想情况下,它还允许像(\a -> a^.foo > 100 && a^.bar < 50)
.
haskell - Haskell 的 lens 包如何处理也是关键字的字段?
镜头如何处理脱糖字段是关键字的情况?我似乎记得读过一些特别的东西,但我不记得我在哪里读到它或者“镜头”访问器的名称最终会是什么。
考虑以下:
将调用什么_type
访问器以及如何避免在getType
这里实现?
我不得不在哈斯克尔学校抨击这一点,因为我在这里无法访问适当的开发环境,但我认为它可能对其他人有用。当我可以进入 ghci 并做一个(如果给出答案)时,我会添加一个答案:browse
,但同时有人知道吗?
结论
谢谢大家,makeLensesWith
根据爱德华的建议,我将使用关键字到替换的映射。
haskell - 使用 ekmett 的镜头更新一个字段的多个子字段
来玩个游戏。我们将使用两堆,都由黑/白边的芯片组成。
一个非常聪明的举动是在 A 堆中翻出黑色筹码,在 B 堆中翻出白色筹码。但是怎么做呢?
不是很优雅。如果不引用每个桩两次,我怎么能做到这一点?
我想出的唯一一件事(我不喜欢它):
(如果很明显,请提前抱歉 - 我对镜头有点陌生,我在组合器和操作员lens
的报价中迷失了方向。可能每个人都需要的东西都藏在那里。当然不是说这很糟糕!但我希望有还包括完整的手册。)