haskell - 使用箭头生成深度嵌套的记录

标签 haskell arrows

我有一个深层嵌套的记录,我正在尝试从数据库重建它。例如,A 包含许多 B 记录。 B 记录有许多 C 记录。 C 有许多 D。我有函数来查询每种类型对象的子对象(下面的 f0f1f2)。

f0 :: A -> [B]
f1 :: B -> [C]
f2 :: C -> [D]

我正在寻找一种优雅的方式来实现f3

f3 :: A -> (A, [(B, [(C, [D])])])

我读过一些关于 Arrows 的内容感觉他们可能很合适。然而,当我尝试将它们结合起来时,我总是遇到障碍。

我从这样的事情开始:

f4 :: A -> (A, [B])
f4 = id &&& f0

这让我达到了第一个层次。但是,我无法找到一种方法将其链接到另一个箭头,该箭头将映射 [B],返回 [(B, [C])] 和使用它作为原始元组的第二个元素。

我对 Haskell 有点陌生,所以如果我需要添加任何其他信息,请告诉我。

谢谢!

更新

稍微修改sclv的答案,我现在有了

data A = A
data B = B
data C = C
data D = D

f0 :: A -> [B]
f0 = undefined

f1 :: B -> [C]
f1  = undefined

f2 :: C -> [D]
f2 = undefined

pairFun f = id &&& f

foo :: A -> (A, [(B, [C])])
foo = fmap (map (pairFun f1)) . pairFun f0

我仍然不知道如何组合最后一个函数 (f2)。

最终更新

多亏了 sclv,事实证明这可以这样完成:

foo = (fmap . map) ((fmap . map) (pairFun f2) . pairFun f1) . pairFun f0

最佳答案

类似的东西应该可以工作(未经测试):

pairFun f = id &&& f

foo = (fmap . map) ((fmap . map) (pairFun f2) . pairFun f1) . pairFun f0

编辑:顺便说一下,思考这个问题的一种方法是使用 conal 的语义编辑器组合器模型 -- http://conal.net/blog/posts/semantic-editor-combinators

关于haskell - 使用箭头生成深度嵌套的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14714872/

相关文章:

haskell - 如何访问特定矩阵元素或具有特定索引的Haskell

function - 是否可以使用通用函数在元组中获取元组的第二个元素?

haskell - Haskell 中的定向梯度直方图

haskell - 澄清 Haskell 中的存在类型

haskell - haskell 和 Arrows 中的类型推断

opengl - 在 Arrow 内调用 IO Monad

haskell - 使 Vector.Generic 成为 Functor(和其他类型类

haskell - Haskell rec 关键字是如何工作的?

haskell - `arr fst` 是如何自然转换的?