データベースから再構築しようとしている深くネストされたレコードがあります。たとえば、A
多くのB
レコードが含まれています。B
レコードには多くのC
レコードがあります。C
多くD
の s があります。各タイプのオブジェクト ( f0
、f1
、およびf2
以下) の子を照会する関数があります。
f0 :: A -> [B]
f1 :: B -> [C]
f2 :: C -> [D]
を実装するエレガントな方法を探していますf3
。
f3 :: A -> (A, [(B, [(C, [D])])])
Arrowsについて少し読んだことがありますが、ぴったりだと思います。しかし、それらを組み合わせようとすると、障害物にぶつかり続けます。
私はこのようなものから始めました:
f4 :: A -> (A, [B])
f4 = id &&& f0
それは私を最初のレベルに導きます。しかし、それを元のタプルの2番目の要素としてマップ[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