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

http - wreq 未使用 cabal 沙箱编译

我正在使用 cabal 沙箱,编译 wreq 库时出现此错误:

我在我的 cabal 文件中使用这些库:

任何想法如何解决编译错误?

0 投票
2 回答
2110 浏览

haskell - 使用镜头读取多个字段

给定类型

我可以通过模式匹配提取某人的姓名、等级和谷物编号:

或者,我可以使用镜头分别提取每个部分

有没有办法在一次遍历数据结构中同时提取所有三个?

某种组合Getters, Getter s a -> Getter s b -> Getter s (a,b)?

0 投票
2 回答
887 浏览

haskell - 使用记录语法在 Haskell 中编写 OOP 风格的“setter”函数

我正在阅读有关镜头的教程,在介绍中,作者lens通过展示我们如何使用标准 Haskell 实现 OOP 风格的“setter”/“getter”的一些示例来激发这个概念。我对以下示例感到困惑。

假设我们User按照图 1(下图)定义了一个代数数据类型。本教程(正确地)指出,我们可以通过NaiveLens数据类型和nameLens函数实现“setter”功能(也在图 1 中)。图 2 给出了一个示例用法。

我很困惑为什么我们需要如此复杂的构造(即NaiveLens数据类型和nameLens函数)来实现“setter”功能,而以下(有些明显的)函数似乎同样能很好地完成这项工作:set' a s = s {name = a}.

但是,鉴于我的“明显”函数就是 lambda 函数的一部分nameLens,我怀疑使用下面的构造确实有优势,但是我太密集了,看不出那个优势是什么。我希望其中一位 Haskell 向导可以帮助我理解。

图 1(定义):

图 2(示例用法):

0 投票
1 回答
423 浏览

haskell - 为什么“失败”(来自镜头)会产生无效遍历?

文档中

尝试第一个Traversal(或),如果它没有返回条目,则返回Fold第二个Traversal(或)。Fold

这仅Traversal在第二个Traversal与第一个的结果不相交或返回完全相同的结果时才有效。

是否有一个生成的无效遍历的简单示例failing和演示它的测试用例?

0 投票
1 回答
136 浏览

haskell - xml-lens API 惊喜:函数组合和 travelsals

以下表达的意图有何不同?我很惊讶他们实际上在下面的示例中键入检查并产生不同的结果。

以及它们如何使用典型的 pom.xml 文件:

在哪里

0 投票
1 回答
341 浏览

haskell - 使用 Prism 作为智能构造函数

我正在浏览关于棱镜的“镜头”文档,我注意到 Control.Lens.Review 中有一行说明中缀审查运算符#'在将棱镜用作智能构造函数时通常使用。'。

这让我有点好奇,因为就我理解的智能构造函数(对参数值添加额外的限制)而言,带有 _Left 的示例,它是“Either”数据类型的构造函数之一,看起来不像是智能构造函数。所以我在谷歌上搜索了一下棱镜作为智能构造函数,但我并没有真正找到任何例子。

有没有人知道这句话的确切含义并举个例子?或者也许告诉我,我对智能构造函数的定义是不正确的,当然。

0 投票
1 回答
301 浏览

arrays - 如果数组和索引都处于状态,则使用镜头进行数组索引

我在状态单子中有一个数组和一个数组索引。我可以使用 idx和其他类似的修饰符来读取use和修改它:+=

现在我想组合arridx形成一个镜头arr[idx]

我怎样才能做到这一点?代码会有所不同Data.Sequence吗?

0 投票
2 回答
429 浏览

haskell - 阵列和索引透镜中的阵列索引透镜

如果数组和索引都处于状态,这是使用镜头进行数组索引的更简单版本,因为我已经解决了一些问题。我不确定是否应该删除原件或原地编辑。

给定

我想写一个函数

这需要arridx镜头并构造一个组合镜头,可用于读取和写入 指向的元素idx。我想要的镜头存在:

我理解这一点comboGetcomboSet原则上可以重写为单独使用arridx镜头。

combo1我的问题是:用arrand构建最惯用的方法是什么idx

0 投票
1 回答
135 浏览

haskell - 使用镜头库构建复杂功能

我正在尝试实现一个函数,该函数有一个lens参数,并且将mconcat是一个Maybe具有 type 的两个应用效果的 monoid (->) r。我可能缺少一些基础知识,因此对分解此问题的任何帮助表示赞赏。

我想编写避免传递相同参数的“用户”代码,如下所示:

这是我尝试过的。无镜头概念:

带镜头:

但它无法编译:

0 投票
1 回答
818 浏览

haskell - 带遍历的 Haskell 镜头教程

我正在尝试遵循本教程:http ://blog.jakubarnold.cz/2014/08/06/lens-tutorial-stab-traversal-part-2.html

我正在使用加载到 ghci 中的以下代码:

从那里开始,像这样简单的东西可以工作:

但是,当我尝试执行下一步时,它不起作用:

我得到:

我看到 Lens 具有 Functor 的类型约束,而 traverse 作为 Applicative 对 f 具有更受约束的类型约束。为什么这不起作用,为什么博客教程建议它起作用?