问题标签 [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 - 如何生成镜头列表?
我的代码中有一个通用模式,其中有一个对象列表,我将它们传递给一个函数choose
让用户选择一个。
但是,返回 anInt
是不幸的,因为现在我必须使用部分(!!)
来访问所选元素。为避免这种情况,我宁愿拥有
我传入一个镜头列表,其中一个用于访问列表中的每个元素。然后,我可以确定使用修改镜头另一端的对象是安全的,而不用担心它是否真的存在。
我怎么能创建这样一个镜头列表?实际上,我需要
作为奖励,更一般的东西
也会很棒 - 为遍历访问的每个点制作一个镜头
haskell - 什么是使用 Control.Lens 中的多个 Getter 调用函数的干净方法。
给定一些定义了镜头的数据结构,例如:
并给出一些我想使用几个 getter 调用的函数,例如:
目前,我最终用括号访问每个字段有很多丑陋,例如:
鉴于lens
库在大多数其他情况下的简洁性,我希望有一些更优雅的东西,但我找不到任何有助于这种特定情况的组合器。
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
)。
haskell - 如何解决无法使用存在类型的镜头?
我第一次使用 Edward Kmett 的镜头库,发现它相当不错,但我遇到了障碍......
[1] 中的问题解释了存在量词破坏了 makeLenses。我真的很想以某种方式使用带有镜头的存在主义。
作为背景,我有课:
对于实际问题,我想要类型:
我希望能够写一些类似的东西:
由于 [1] 中解释的原因,这不起作用。如果我通过编译向 GHC 询问调试信息-ddump-splices
,我会得到:
拼接本身是空白的,这向我表明它没有产生任何声明。这部分是我期待并理解的,因为我已经阅读了 [1]。
我想知道的是我该怎么做——我可以做些什么来解决这个问题?我可以做些什么来避免在这个上游游泳?我希望能够通过组合镜头的路径访问我的结构的任何部分,但是因为我有其他类型的字段,例如Set AnyFile
,除非我可以使用AnyFile
镜头访问 的内容,否则我不能这样做。
haskell - 如何从 GHCi 中的记录制作镜头
我想和Lens
图书馆玩一会儿。我已经将它加载到 GHCi 并创建了一个带有适当下划线的记录数据类型:
我想制作Foo
使用makeLenses
模板的镜头。我想这样做而不需要通读整套Template-Haskell 文档。
我可以在 GHCi 提示符下输入什么咒语来让它工作?
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
(^.)
(^?)
问题:
看起来at
和ix
做同样的事情,至少在Map
. 两者都取一个键并为该键的值提供一个“镜头”。但是,ix
似乎与函数组合运算符配合得很好(.)
。两者有什么区别?
离题咆哮:
我和其他人一样喜欢中缀运算符,但 Control.Lens 包似乎有点过火了。对于一个有一些英文名字和某个地方的键的新用户来说,学习曲线会降低。由于 Lens 库中使用了大量的包装类,如果您还不知道发生了什么,则特别难以挖掘类型签名。看在老天的份上,我的代码开始看起来像 Perl。
haskell - 如何编写 Control.Lens.AT 的实例
我有一个数据结构,可以理解为类似于Data.Map
它将一种类型的键映射到另一种类型的值。我想Control.Lens.At
为这种类型编写一个实例,但我似乎永远无法满足所有要求。
给定Struct k v
, lookup
,和insert
,我必须做什么才能工作?update
delete
instance At (Struct k v)
haskell - 为镜头寻找缺失的状态组合器
我目前的代码如下所示:
foo
一个字段在哪里,Lens
并且Foo
runFoo :: MonadState m => Foo -> m Foo
我认为应该有一种方法可以在一行中执行此操作,但我找不到。我认为它应该有这样的评论:
问题:
- 这样的组合器存在吗?如果是这样,那是什么?
- 当我遇到这样的另一个问题时,搜索它的最佳方法是什么(即通常我会在 Hoogle 中输入它,但我没有运气好用镜头库做到这一点)
- 这实际上是 Control.Monad 中的原始组合器吗?(如果这是 kleisli 箭的另一份工作,我会有点尴尬)
haskell - 我可以制作带有 Monad 约束的镜头吗?
背景:这个问题专门参考Control.Lens
(撰写本文时的版本 3.9.1)
我一直在使用镜头库,能够读取和写入结构的一部分(或遍历的部分)非常好。然后,我考虑了是否可以将镜头用于外部数据库。当然,然后我需要在IO Monad
. 所以概括一下:
问题:
给定一个 getter和一个在哪里是 Monad(s -> m a)
的 setter ,是否有可能构造现在包含镜头的 Functor 的位置也是一个 Monad?是否仍然可以将这些与其他“纯功能”镜头组合在一起?(b -> s -> m t)
m
Lens s t a b
(.)
例子:
我可以Lens (MVar a) (MVar b) a b
使用readMVar
andwithMVar
吗?
选择:
monad中的容器是否有等效于 Control.Lens 的容器,IO
例如MVar
or IORef
(or STDIN
)?
list - Haskell 列表和 Control.Lens
我正在为一种简单的“动态类型”语言编写 AST 库。我已经编写了我的语法树和解析器。现在我正在处理 AST,我有兴趣为此目的使用镜头包。
考虑
我可以编写一个镜头来很容易地操纵物场:
但我不知道从哪里开始操作 Arr 元素。我想要一个镜头:
为了方便起见,我将更改我的 Obj 表示,但了解如何使用 lens 对列表进行索引仍然会有所帮助。