gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:12:32 24 4
gpt4 key购买 nike

我有一个深度嵌套的记录,我试图从数据库中重建它。例如,A包含许多 B记录。 B记录有很多C记录。 C有很多D s。我有查询每种类型对象的子对象的函数(下面的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com