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

haskell - 如何将 IORef 与镜头一起使用?

想知道如何最好地将Control.Lens包与IORefs 结合起来。具体来说,我希望能够atomicModifyIORef与镜头一起使用,这样我就可以提供一个类型的函数a -> (a, b)并从操作中返回一个值。代码片段:

0 投票
1 回答
734 浏览

haskell - Haskell:重用带有镜头、镜头-aeson 和嵌套 JSON 的 FromJSON 实例

我一直在玩 Aeson 和镜头包(lens-aeson,从核心镜头包迁移而来),一直在努力让它们一起工作。

作为一个玩具示例,我有一个类型:

和 FromJSON 实例:

到目前为止,一切都很好。

现在,假设我有一些嵌套的 JSON 数据进来,我想从中提取:

我不关心其余的,只关心这个“颜色”值。更糟糕的是,假设 JSON 不是特别一致,所以有时我有

和其他时候

我希望能够尽可能轻松地获取颜色值,然后理想地使用我的 FromJSON 实例将其解析为一种颜色。这是一个玩具示例,但数据类型可能有许多字段等,而不是颜色。

我开始研究lens-aeson的东西,这让我的希望大增。它允许非常容易地查看 JSON 结构。例子:

但是我找不到通过我的 parseJSON 调用来运行它的方法来返回Just Yellow。parseJSON 似乎很接近,因为它采用了正确的类型(里面的东西可能最少),但在那之后就分崩离析了。理想情况下,我可以执行以下操作之一:

我最接近弄清楚的是重新编码然后解码上述结果,例如:

这给了我我想要的一些 JSON 编码数据。在更复杂的情况下,如果该数据是一个对象或数组,我可以decode像往常一样在它上面运行以取回我更复杂的类型,但解码不喜欢不正确的 JSON;未包装在数组或对象语法中的东西。此外,先解码然后编码似乎非常混乱且性能不佳。

我对镜头和整个 Aeson 相当陌生(以及 Haskell,尽管我已经开始理解整体上像 monads/applicatives 这样的东西,所以进展缓慢!)。你们将如何完成这项工作?

我的一般动机是我将处理大量 JSON 数据,但实际上只关心它的片段,因此每次我需要从 JSON 中的不同位置取出这些片段时,我宁愿避免声明数据类型,而只是为我关心的位声明类型。

请注意,我使用的是 lens-aeson-1 和 lens-4.4.0.1,而不是工作方式略有不同的 aeson-lens(它可能与答案相关)!

提前致谢!詹姆士

0 投票
3 回答
3703 浏览

haskell - makeLenses 和 makeFields 有什么区别?

很不言自明。我知道makeClassy应该创建类型类,但我认为两者之间没有区别。

PS。解释两者的默认行为的奖励积分。

0 投票
1 回答
355 浏览

haskell - Isomorphism 中前向和后向映射的关系(Lens 包)

为什么/不应该限制s同构到t,并且b同构到a类型的同构Iso s t a b

我知道我们有一个前向映射s -> a和一个后向映射b -> t,但是为什么在这些映射上没有强加关系?

0 投票
0 回答
140 浏览

haskell - 在模块之间共享镜头场定义的惯用方式

如果我有两个模块都使用Control.Lens.TH'makeFields从记录生成字段,并且每个不同模块中的记录具有相同的字段名称,那么确保两个模块使用相同定义的name镜头和HasName没有一个模块的类依赖于另一个?

目前,我正在使用另一个以SharedFields单个记录命名的模块,其中每个字段都需要共享,然后将该SharedFields模块导入到需要生成 TH 字段的任何其他内容中——但这很尴尬且容易出错。



0 投票
1 回答
394 浏览

haskell - How do you fmap a Getter?

As discussed on reddit, you can't just lift a Lens' a b to Lens' (Maybe a) (Maybe b). But for the special case Getter a b, this is obviously possible, since it's isomorphic to a->b. But unlike with Iso, there appears to be no standard function to perform this lift.

What's the preferred way to do that? In cases like

I could of course do

but that doesn't work as well in other applications, as when operating on a state monad.

0 投票
2 回答
1108 浏览

haskell - 如何使用镜头库按索引从列表中删除项目?

我可以使用这样的镜头查看列表中的第 4 项:

有没有什么东西可以代替“预览”以便从列表中删除第四个项目而不是查看它?返回列表应与原始列表相同,即第 4 项将被删除。

或者也许有一种方法可以使用过滤功能来做到这一点?

0 投票
2 回答
219 浏览

haskell - 使用 Haskell 镜头库,我如何将 getter 视为“一流”?

我注意到我通常构建使用镜头获取值的函数,将一些函数应用于值并返回结果。例如,对一对元素求和 \pair -> (pair ^. _1) + (pair ^. _2)

我觉得应该有一些组合器来组合第一类吸气剂并返回另一个吸气剂(可能是 type (b -> c -> d) -> Getter a b -> Getter a c -> Getter a d)。有什么帮助吗?

0 投票
1 回答
126 浏览

haskell - .~ 的一元版本(Haskell)

我正在寻找一个版本,.~它接受一个包含在 Monad 中的值并返回一个 Monad。例如:

(0, 1) & _1 .~ 100 = (100,1)

假设.~~会:

(0, 1) & _1 .~~ return 100 = return (100,1)

虽然不难定义,但它是否已经在 Lens 包中的某个地方定义了?

0 投票
1 回答
133 浏览

haskell - 融合遍历

The Traversable Paper在第 18-19 页给出了一个融合 monoidal 和 monadic 遍历的示例,这听起来很有趣,但我对他们的 LaTex 感到困惑。

惊人的结果是:

是相同的:

我认为该结果的类型是:

但不是100%肯定。会说 Emoji 的人可以告诉我它在 Haskell 中的外观吗?

更新

我认为 xInACircle 可能是一个中缀sequenceA。类型匹配。(,)或者也许它只是Traversable. <*>尽管结果看起来有点像,但绝对不是,t (x <*> y) = t x <*> t y但他们在论文中没有使用 Wingding <*>

更新 2

xInACircle 的类型是 (Functor m, Functor n) ⇒ (a → mb) → (a → nb) → (a → (m XInASquare n) b)。提醒你什么?不是我。