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

haskell - 如何生成镜头列表?

我的代码中有一个通用模式,其中有一个对象列表,我将它们传递给一个函数choose让用户选择一个。

但是,返回 anInt是不幸的,因为现在我必须使用部分(!!)来访问所选元素。为避免这种情况,我宁愿拥有

我传入一个镜头列表,其中一个用于访问列表中的每个元素。然后,我可以确定使用修改镜头另一端的对象是安全的,而不用担心它是否真的存在。

我怎么能创建这样一个镜头列表?实际上,我需要

作为奖励,更一般的东西

也会很棒 - 为遍历访问的每个点制作一个镜头

0 投票
1 回答
165 浏览

haskell - 什么是使用 Control.Lens 中的多个 Getter 调用函数的干净方法。

给定一些定义了镜头的数据结构,例如:

并给出一些我想使用几个 getter 调用的函数,例如:

目前,我最终用括号访问每个字段有很多丑陋,例如:

鉴于lens库在大多数其他情况下的简洁性,我希望有一些更优雅的东西,但我找不到任何有助于这种特定情况的组合器。

0 投票
1 回答
438 浏览

haskell - Haskell 镜头中不同的 setter 和 getter 类型

我有一个data type G,其中有字段_repr :: Data.Graph.Inductive.Gr String String。通常的方式,当向Gr图中添加新节点时,我们必须提供一个LNode a对象,该对象基本上定义为 的元组(Int, a),其中 Int 是 Graph 中的节点索引 - 请参见add下面的示例函数。

我想实现一个函数addx,它将自动计算索引(例如通过使用Data.Graph.Inductive.newNodes函数)。我希望addx有 的签名,addx :: String -> G -> Int这个函数将计算新的自由索引,修改图 G 并返回这个计算的索引。G在 Haskell 中是否可以通过使用镜头或类似的东西来创建这样的功能(这将修改现有对象 -在这种情况下)?

我已经看到,Haskell lens 被定义为lens :: (a -> c) -> (a -> d -> b) -> Lens a b c d和 lens 基本上是一个“getter”和“setter”,所以它的签名允许不同类型的 getter 输出(c)、setter 值(d)和 setter 输出(b)。

0 投票
1 回答
551 浏览

haskell - 如何解决无法使用存在类型的镜头?

我第一次使用 Edward Kmett 的镜头库,发现它相当不错,但我遇到了障碍......

[1] 中的问题解释了存在量词破坏了 makeLenses。我真的很想以某种方式使用带有镜头的存在主义。

作为背景,我有课:

对于实际问题,我想要类型:

我希望能够写一些类似的东西:

由于 [1] 中解释的原因,这不起作用。如果我通过编译向 GHC 询问调试信息-ddump-splices,我会得到:

拼接本身是空白的,这向我表明它没有产生任何声明。这部分是我期待并理解的,因为我已经阅读了 [1]。

我想知道的是我该怎么做——我可以做些什么来解决这个问题?我可以做些什么来避免在这个上游游泳?我希望能够通过组合镜头的路径访问我的结构的任何部分,但是因为我有其他类型的字段,例如Set AnyFile,除非我可以使用AnyFile镜头访问 的内容,否则我不能这样做。

[1]存在量词悄悄地破坏了 Template Haskell (makeLenses)。为什么?

0 投票
1 回答
1236 浏览

haskell - 如何从 GHCi 中的记录制作镜头

我想和Lens图书馆玩一会儿。我已经将它加载到 GHCi 并创建了一个带有适当下划线的记录数据类型:

我想制作Foo使用makeLenses模板的镜头。我想这样做而不需要通读整套Template-Haskell 文档

我可以在 GHCi 提示符下输入什么咒语来让它工作?

0 投票
1 回答
2074 浏览

haskell - Haskell的Lens库中的`ix`和`at`有什么区别

我只知道一个有效,另一个无效。

上下文: 我有一个数据结构F,其中包含Data.Map.Map k S另一个数据结构S。我的目标是建立一个Lens给定的F并且k将描述一个领域的S.

困难在于k地图中可能不存在密钥。很好,该函数可以将其返回值包装在 Maybe 中。但是我无法通过 Maybe using 传播镜头at。在阅读了很多 Stack Overflow 的答案后,我遇到了这个

事实证明,如果我也at替换为.ix(^.)(^?)

问题: 看起来atix做同样的事情,至少在Map. 两者都取一个键并为该键的值提供一个“镜头”。但是,ix似乎与函数组合运算符配合得很好(.)。两者有什么区别?


离题咆哮:

我和其他人一样喜欢中缀运算符,但 Control.Lens 包似乎有点过火了。对于一个有一些英文名字和某个地方的键的新用户来说,学习曲线会降低。由于 Lens 库中使用了大量的包装类,如果您还不知道发生了什么,则特别难以挖掘类型签名。看在老天的份上,我的代码开始看起来像 Perl。

0 投票
1 回答
213 浏览

haskell - 如何编写 Control.Lens.AT 的实例

我有一个数据结构,可以理解为类似于Data.Map它将一种类型的键映射到另一种类型的值。我想Control.Lens.At为这种类型编写一个实例,但我似乎永远无法满足所有要求。

给定Struct k v, lookup,和insert,我必须做什么才能工作?updatedeleteinstance At (Struct k v)

0 投票
2 回答
143 浏览

haskell - 为镜头寻找缺失的状态组合器

我目前的代码如下所示:

foo一个字段在哪里,Lens并且FoorunFoo :: MonadState m => Foo -> m Foo

我认为应该有一种方法可以在一行中执行此操作,但我找不到。我认为它应该有这样的评论:

问题:

  • 这样的组合器存在吗?如果是这样,那是什么?
  • 当我遇到这样的另一个问题时,搜索它的最佳方法是什么(即通常我会在 Hoogle 中输入它,但我没有运气好用镜头库做到这一点)
  • 这实际上是 Control.Monad 中的原始组合器吗?(如果这是 kleisli 箭的另一份工作,我会有点尴尬)
0 投票
3 回答
1922 浏览

haskell - 我可以制作带有 Monad 约束的镜头吗?

背景:这个问题专门参考Control.Lens(撰写本文时的版本 3.9.1)

我一直在使用镜头库,能够读取和写入结构的一部分(或遍历的部分)非常好。然后,我考虑了是否可以将镜头用于外部数据库。当然,然后我需要在IO Monad. 所以概括一下:

问题:

给定一个 getter和一个在哪里是 Monad(s -> m a)的 setter ,是否有可能构造现在包含镜头的 Functor 的位置也是一个 Monad?是否仍然可以将这些与其他“纯功能”镜头组合在一起?(b -> s -> m t)mLens s t a b(.)

例子:

我可以Lens (MVar a) (MVar b) a b 使用readMVarandwithMVar吗?

选择:

monad中的容器是否有等效于 Control.Lens 的容器,IO例如MVaror IORef(or STDIN)?

0 投票
1 回答
1849 浏览

list - Haskell 列表和 Control.Lens

我正在为一种简单的“动态类型”语言编写 AST 库。我已经编写了我的语法树和解析器。现在我正在处理 AST,我有兴趣为此目的使用镜头包。

考虑

我可以编写一个镜头来很容易地操纵物场:

但我不知道从哪里开始操作 Arr 元素。我想要一个镜头:

为了方便起见,我将更改我的 Obj 表示,但了解如何使用 lens 对列表进行索引仍然会有所帮助。