问题标签 [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.
haskell - Control.Lens 中的“非法多态或限定类型”
我正在与Control.Lens
. 我正在编写的实际功能相当复杂,但出于这个问题的目的,我将其归结为一个最小的失败示例:
这无法编译,产生以下错误消息:
为什么这是非法的?它似乎与以下内容非常相似,它确实可以编译:
所以我假设不同之处在于Lens
. 但是Lens
类型使exampleFunc
' 的类型非法呢?我有一个偷偷摸摸的怀疑它与Functor
定义中的限定有关Lens
,但我可能是错的。作为参考,定义为Lens
:
那么,我是否必须以某种方式满足Functor
我的定义中的资格exampleFunc
?如果是这样,怎么做?我没有看到在我的类型签名中我有机会声明这个约束。Functor
或者也许我走错了路,我的问题与约束无关。
我已经阅读了有关“非法多态等”错误消息的所有 Stack Overflow 问题。也许这是我对 Haskell 展示不熟悉,但我看不出任何这些问题适用于我目前的情况。
我也无法找到有关错误消息一般含义的任何文档。
haskell - 在 StateT 中使用镜头对内部单子进行操作
请看下面liftIO
函数中的使用increment
。我有一种预感,使用镜头可以更好地处理它。有什么建议么?
编辑:我认为下面可能有一种类似于“zoom2”的机制。
haskell - 是否可以用 setter 嵌套`at`?
我想在 2 级映射中设置一个值 - 即映射中的一个键,该键是“外部”映射中某个键的值。对于普通的 Map 我可以使用类似m & at 42 ?= "value"
但我找不到任何方法来嵌套 2at
使用镜头设置这种嵌套值的最简单方法是什么?
haskell - Haskell - 镜头,使用“到”功能
我有以下代码。我希望能够在给定游戏状态时修改活跃玩家的生活。我想出了一个activePlayer
镜头,但是当我尝试将它与-=
操作员结合使用时,我收到以下错误:
和有问题的代码:
每个玩家按顺序轮到他们。我需要同时跟踪所有玩家以及当前活跃的玩家,这就是我如何构建它的原因,尽管我对不同的结构持开放态度,因为我可能还没有合适的结构。
haskell - Haskell、Lenses、Getter 和 Setter
我无法理解 Haskell 中镜头库的所有细微差别。
假设我有以下镜头
在 ghci 提示符下执行以下操作没有问题:
但是,当我尝试将其参数化为函数时,出现以下错误。
当我希望将其推断为完整时,它看起来p
被推断为. 我尝试强制使用以下内容,但 ghci 抱怨 RankNTypes in 。Accessor
Lens
p
Lens
Lens' a b
如果有人能帮助我弄清楚为什么p
会以这种方式推断出来,以及如何使它表现得像一个完整的Lens
.
haskell - 如何放大酸性状态?
鉴于上面的代码,我的印象是应该可以做到这一点:
但 GHC 会抱怨如下:
有任何想法吗?
haskell - Haskell:模板 Haskell 和作用域
这段代码编译得很好:
但是,此代码出现错误:
错误:
makeLenses ''None
我只是在类型声明之间添加了一行。
这是否意味着 TemplateHaskell 代码可以改变类型构造函数的范围?
有谁知道有关此问题的详细信息(或如何避免此问题)?
haskell - 用 `at` 和 `ix` 组合镜头
假设我有一些相当简单的数据类型Person
,其中包含几个字段,以及一个包含Person
s 集合的类型。
我想创建一个镜头,让我可以通过查找他们的密钥来访问个人
看来我这样做的两个选择是使用at
或ix
索引到字典中
但是这些选项都不能让我做我想做的事,那就是让 aLens'
访问 aPerson
而不是 a Maybe Person
。选项 1 不能与其他镜头很好地组合,选项 2 意味着我必须放弃我的吸气剂。
我理解为什么 ix
并且at
是这样写的。字典中可能不存在密钥,因此如果您想要一个Lens'
同时启用 getter 和 setter 的 a,它必须访问 a Maybe a
。另一种方法是接受 a Traversal'
,它可以访问 0 或 1 值,但这意味着放弃你的吸气剂。但就我而言,我知道我想要的元素将始终存在,所以我不需要担心丢失键。
有没有办法写出我想写的东西——或者我应该重新考虑我的程序结构?
haskell - 在 Haskell 中使用 Lens 修改值
我发现自己经常使用这种模式:
这似乎是 Control.Lens 应该能够做的事情,但我想我还没有找到合适的操作员。有没有更好的办法?另外,在这段代码中我还应该做些什么不同的事情吗?
haskell - 如何使用镜头库编写依赖于其他镜头的复杂镜头?
目前,我有一个WorkLog
类型,有开始和结束日期。我还想添加一个持续时间镜头,它将根据开始日期和结束日期得出。它应该是只读的,或者如果它的值发生变化则更改结束日期(我想知道如何实现这两个版本,即使我只会使用一个)。
这是我的代码。基本上,如果您可以实现workLogDurationRO
andworkLogDurationRW
函数以使所有测试通过主要测试,那将回答我的问题。