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

haskell - Control.Lens 中的“非法多态或限定类型”

我正在与Control.Lens. 我正在编写的实际功能相当复杂,但出于这个问题的目的,我将其归结为一个最小的失败示例:

这无法编译,产生以下错误消息:

为什么这是非法的?它似乎与以下内容非常相似,它确实可以编译:

所以我假设不同之处在于Lens. 但是Lens类型使exampleFunc' 的类型非法呢?我有一个偷偷摸摸的怀疑它与Functor定义中的限定有关Lens,但我可能是错的。作为参考,定义Lens

那么,我是否必须以某种方式满足Functor我的定义中的资格exampleFunc?如果是这样,怎么做?我没有看到在我的类型签名中我有机会声明这个约束。Functor或者也许我走错了路,我的问题与约束无关。

我已经阅读了有关“非法多态等”错误消息的所有 Stack Overflow 问题。也许这是我对 Haskell 展示不熟悉,但我看不出任何这些问题适用于我目前的情况。

我也无法找到有关错误消息一般含义的任何文档。

0 投票
1 回答
523 浏览

haskell - 在 StateT 中使用镜头对内部单子进行操作

请看下面liftIO函数中的使用increment。我有一种预感,使用镜头可以更好地处理它。有什么建议么?


编辑:我认为下面可能有一种类似于“zoom2”的机制。

0 投票
2 回答
111 浏览

haskell - 是否可以用 setter 嵌套`at`?

我想在 2 级映射中设置一个值 - 即映射中的一个键,该键是“外部”映射中某个键的值。对于普通的 Map 我可以使用类似m & at 42 ?= "value" 但我找不到任何方法来嵌套 2at使用镜头设置这种嵌套值的最简单方法是什么?

0 投票
1 回答
842 浏览

haskell - Haskell - 镜头,使用“到”功能

我有以下代码。我希望能够在给定游戏状态时修改活跃玩家的生活。我想出了一个activePlayer镜头,但是当我尝试将它与-=操作员结合使用时,我收到以下错误:

和有问题的代码:

每个玩家按顺序轮到他们。我需要同时跟踪所有玩家以及当前活跃的玩家,这就是我如何构建它的原因,尽管我对不同的结构持开放态度,因为我可能还没有合适的结构。

0 投票
1 回答
1879 浏览

haskell - Haskell、Lenses、Getter 和 Setter

我无法理解 Haskell 中镜头库的所有细微差别。

假设我有以下镜头

在 ghci 提示符下执行以下操作没有问题:

但是,当我尝试将其参数化为函数时,出现以下错误。

当我希望将其推断为完整时,它看起来p被推断为. 我尝试强制使用以下内容,但 ghci 抱怨 RankNTypes in 。AccessorLenspLensLens' a b

如果有人能帮助我弄清楚为什么p会以这种方式推断出来,以及如何使它表现得像一个完整的Lens.

0 投票
1 回答
285 浏览

haskell - 如何放大酸性状态?

鉴于上面的代码,我的印象是应该可以做到这一点:

但 GHC 会抱怨如下:

有任何想法吗?

0 投票
1 回答
1293 浏览

haskell - Haskell:模板 Haskell 和作用域

这段代码编译得很好:

但是,此代码出现错误:

错误:

makeLenses ''None我只是在类型声明之间添加了一行。
这是否意味着 TemplateHaskell 代码可以改变类型构造函数的范围?

有谁知道有关此问题的详细信息(或如何避免此问题)?

0 投票
3 回答
451 浏览

haskell - 用 `at` 和 `ix` 组合镜头

假设我有一些相当简单的数据类型Person,其中包含几个字段,以及一个包含Persons 集合的类型。

我想创建一个镜头,让我可以通过查找他们的密钥来访问个人

看来我这样做的两个选择是使用atix索引到字典中

但是这些选项都不能让我做我想做的事,那就是让 aLens'访问 aPerson而不是 a Maybe Person。选项 1 不能与其他镜头很好地组合,选项 2 意味着我必须放弃我的吸气剂。

我理解为什么 ix并且at是这样写的。字典中可能不存在密钥,因此如果您想要一个Lens'同时启用 getter 和 setter 的 a,它必须访问 a Maybe a。另一种方法是接受 a Traversal',它可以访问 0 或 1 值,但这意味着放弃你的吸气剂。但就我而言,我知道我想要的元素将始终存在,所以我不需要担心丢失键。

有没有办法写出我想写的东西——或者我应该重新考虑我的程序结构?

0 投票
2 回答
1291 浏览

haskell - 在 Haskell 中使用 Lens 修改值

我发现自己经常使用这种模式:

这似乎是 Control.Lens 应该能够做的事情,但我想我还没有找到合适的操作员。有没有更好的办法?另外,在这段代码中我还应该做些什么不同的事情吗?

0 投票
2 回答
186 浏览

haskell - 如何使用镜头库编写依赖于其他镜头的复杂镜头?

目前,我有一个WorkLog类型,有开始和结束日期。我还想添加一个持续时间镜头,它将根据开始日期和结束日期得出。它应该是只读的,或者如果它的值发生变化则更改结束日期(我想知道如何实现这两个版本,即使我只会使用一个)。

这是我的代码。基本上,如果您可以实现workLogDurationROandworkLogDurationRW函数以使所有测试通过主要测试,那将回答我的问题。