2

データベースから再構築しようとしている深くネストされたレコードがあります。たとえば、A多くのBレコードが含まれています。Bレコードには多くのCレコードがあります。C多くDの s があります。各タイプのオブジェクト ( f0f1、および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
4

1 に答える 1

3

このようなものは動作するはずです(テストされていません):

pairFun f = id &&& f

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

編集: ちなみに、これについて考える 1 つの方法は、セマンティック エディター コンビネーターの conal のモデルを使用することです -- http://conal.net/blog/posts/semantic-editor-combinators

于 2013-02-05T19:20:02.467 に答える