问题标签 [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 回答
703 浏览

haskell - 协调镜头使用与数据库访问

我最近一直在玩镜头,发现它们的预期用途非常令人愉快——深入研究复杂的数据结构。但我最欣赏它们的领域之一是数据库访问(特别是 sqlite,但我认为我的问题适用于大多数数据库),但我看不出有任何方法可以编写不会严重牺牲的镜头性能或粒度。

如果我写一个镜头(或者我认为可能是一个棱镜,根据 NULLable 字段?)从数据库到表,从表到行,从行到列,每一步都会导致数据库访问,这意味着应该是一次访问至少是 4。

另一方面,如果我的目标是使用镜头/棱镜以 1:1 映射 DB 访问,那么当我只想查看哪些列是时,我会得到无法分解成更小的镜头的镜头在表中,依此类推。

将镜头与数据库一起使用是否有意义,如果是这样,我是否错过了一种明显的方法来避免重复工作以避免不必要的数据库访问?

0 投票
1 回答
334 浏览

haskell - 如何使用 Control.Lens 中的“over”但执行一元操作并收集结果?

问题很简单。我有一个看起来像这样的结构

我有一个镜头可以改变Item数据结构中 s 的内容,比如这个

这里的结构并不重要,我只是想展示一个使用棱镜和深度嵌套的例子。

现在的问题是我需要传递给的函数overString -> IO String,而不是仅仅String -> String。与我在这里寻找的类似的东西是类似的mapM,但带有镜头。有可能做这样的事情吗?

0 投票
1 回答
594 浏览

haskell - 如何使用 Lenses 将 IO 操作的结果与 `concat` 一起表达`mapM`?

我试图找出一种方法如何以允许以下方式traverseOf结合。>>=

TLDR;简单的 Haskell 中的一个简单示例是这样的,但在数据结构的深处使用镜头。

这是一个带有示例的冗长解释

现在最后一个例子是问题所在,因为我通过改变正在应用的函数来作弊。在concatReplace我能够使用>>=(感谢#haskell-lens频道上的乐于助人的人)来实现concatMap类似的功能。但在我的真实代码中,我拥有的功能是String -> IO [String],看起来像这样

但是这个例子不再进行类型检查。我需要的是基本上将逻辑放在一起,ioReplaceconcatReplace以一种我能够将具有该类型的函数应用String -> IO [String]到包含[String].

0 投票
1 回答
434 浏览

json - 具有错误处理功能的 Aeson 和 Lenses

我对镜头的魔力还很陌生,所以我遇到了一些麻烦。

参考:https ://www.fpcomplete.com/user/tel/lens-aeson-traversals-prisms

可以通过以下方式遍历 JSON 对象:

对于类似于以下内容的 JSON 对象:

Maybe monad 一直在使用,所以如果任何“访问器”失败,我会得到一个Nothing.

我也想传播失败,以便我知道哪个访问器失败了。

我能想到的唯一方法是传递一个访问器数组,按顺序应用它们,并在任何失败的地方返回一个错误。像这样的东西:

所以有了这个:

有没有更优雅的方式来做到这一点?为镜头制作一个 Either-ish monad,结果是什么withFailure

0 投票
1 回答
99 浏览

haskell - 构图时的麻烦

首先,一段代码:

#haskell-lens 频道上的友好帮助指示我使用最后一行,但我也希望能够设置。

有什么帮助吗?

稍后编辑:这似乎有效:

0 投票
1 回答
185 浏览

haskell - Haskell 中带有镜头的惯用风格

我还没有完全理解镜头。

有没有更惯用的镜头方式来做到这一点:

0 投票
3 回答
242 浏览

haskell - 如何使用控制镜头大写字符串?

我正在玩这个lens包,我试图只使用镜头来大写一个字符串。基本上我想调用toUpper每个单词的每个第一个元素。这似乎很容易做到,但我根本不知道该怎么做。我需要一个可遍历的吗?我如何按空格等分割...

0 投票
1 回答
118 浏览

haskell - 如何在新版本 (4.3) 中替换旧镜头版本中的“makeIso”?

我有一些makeIsolens包中使用的代码:

现在我想将此代码与 4.3 版本的lens包一起使用。此版本缺少makeIso,更改日志说:

删除makeIsos以支持makePrismsand makeLenses。这些函数中的每一个都将Isos在适当的时候构建。

因为从来没有这样的功能,makeIsos我认为这是一个拼写错误,他们的意思是makeIso. 所以我尝试替换makeIso为,makeLenses但这并没有创建 foo Iso

更换的正确方法是makeIso什么?

谢谢你的帮助

0 投票
1 回答
455 浏览

haskell - 无法安装 lens-4.2 : Cabal 1.20.0.2, GHC 7.6.3, Ubuntu 14.04

我正在安装 leksah(“cabal install leksah”),但它失败并显示类似于下面的消息(关于镜头 4.2 依赖项)

我尝试安装最新版本,但这并没有解决我的问题。(我已经注销了 - “ghc-pkg unregister lens”)

注意:我不想在沙箱上安装 leksah

“ghc-pkg 列表”的输出

0 投票
0 回答
263 浏览

haskell - 如何使用镜头和可扩展效果?

我想使用镜头可扩展效果来做一个简单的例子。
错误消息说类型不明确,因为类型类带有参数,我猜HasObj xGHC 无法理解pos来自哪里。
makeClassy用通用数据函数定义抽象数据类型非常有用,因此在我的实际项目中需要它。

我的问题是:我怎样才能让它工作?
或者,有没有办法从数据类型定义镜头并在 Eff.State 中使用它们?

错误信息: