问题标签 [haskell-lens]

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 投票
2 回答
2350 浏览

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

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

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

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

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

0 投票
2 回答
758 浏览

haskell - 使用自定义名称处理器而不是默认的基于“下划线”的“镜头”库生成镜头

标准makeLenses实现为以下划线开头的记录的所有字段生成镜头。由于许多原因,我非常不喜欢在我的记录中引入如此尴尬的命名约定的想法。我想要做的只是为记录的所有字段生成镜头,并通过在字段名称后附加一个后缀“L”来命名它们。

有了一个fc-labels库,我所要做的就是

但是镜头库的规则集和东西的配置要复杂得多,这并不容易引起人们的注意。所以我要求一个特定的配方来达到同样的效果。

0 投票
2 回答
1819 浏览

haskell - 使用“镜头”从地图中获取多个结果

有这些进口:

以及定义如下的映射值:

我可以像这样一个一个地得到它的元素:

我想知道的是,有一组这样的键:

如何构造这样的吸气剂(我猜),使用它我将能够获得一组(或列表)匹配元素:

请注意,结果仅包含 2 个元素,因为 key 没有匹配项'd'

0 投票
1 回答
892 浏览

haskell - 变形与镜头有何关系?

Lens,记录访问器如何,例如

http://hackage.haskell.org/packages/archive/lens/3.9.0.2/doc/html/Control-Lens-Type.html#t:Lens

与变形有关?例如

http://hackage.haskell.org/packages/archive/recursion-schemes/3.0.0.2/doc/html/Data-Functor-Foldable.html#v:ana

你能让前者成为后者的实例吗?

我最近经常使用镜头。在 Haskell 编程中,镜头在许多方面都至关重要。它们是用于记录访问、有状态程序的工具……为了更好地理解镜头,我开始阅读“香蕉、镜头、信封和铁丝网”论文。在“INSIDE 206-105”的帮助下,我慢慢地重新实现了 Haskell 中的 -morphisms。然后我想到了上面的问题。

0 投票
1 回答
979 浏览

haskell - Control.Lens 的索引列表需要 Monoid 约束

以下代码无法编译:

给出这个错误

假设 MyType 成为一个幺半群没有意义,我怎样才能获得允许我访问这个嵌套字段的 Lens(或 Traversal,或任何最合适的 - 我不确定区别)?最好具有阅读和更新的能力。

0 投票
2 回答
2105 浏览

haskell - Combining lenses

Using a lens library I can apply a modification function to individual targets, like so:

How can I combine those individual lenses (_1 and _3) to be able to perform this update to both of the targets at once? I expect something in the spirit of the following:

0 投票
2 回答
917 浏览

haskell - 为什么我的数据类型需要一个 Monoid 实例才能使用这个镜头?

我在具有 SceneGraph 类型字段“_scene”的记录上使用下面的代码。我使用 makeLenses 为它创建了镜头。

我收到错误:

但我不明白为什么 SceneGraph 必须是 Monoid 的一个实例才能使用这个镜头。

0 投票
1 回答
214 浏览

haskell - 将吸气剂组合成一个折叠

本着以下问题的精神:

我现在正在寻找一种将多个Getter组合成一个Fold的方法,如下所示:

会导致:

但上面的代码实际上失败并显示以下消息:

那么我该如何实现呢?这可能吗?

0 投票
1 回答
391 浏览

haskell - 我可以使用一元动作从 Control.Lens 过滤折叠吗?

Control.Lens.Fold contains filtered,我可以在应用一些单子操作之前使用它来过滤列表。似乎没有对应的filteredM- 但有没有办法获得这种效果?

要清楚,说我有

我如何适用于for which返回actionM的每个元素?xspredMTrue

一个重要的限制是我想predM在第一次调用之前对所有调用进行排序actionM- 所以我需要一种方法来对列表进行两次传递。我不能仅仅将predMand组合actionM成一个函数。