2
我有一個深層嵌套的記錄,我試圖從數據庫重建。例如,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
它得到我的第一級。然而,我很遺憾找到一種方法將其鏈接到另一個箭頭上,該箭頭將映射[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
真棒,這絕對讓我更接近。不過,我的福式讓我失望了。我有'foo = fmap(map(pairFun f1))。這意味着'foo'現在具有'foo :: A - >(A,[(B,[C])])''的pairFun f0'。很近。我無法圍繞如何組合最後一個功能。想法? –
@RJRegenold看到我的編輯。我忘記了我們在fmap中有兩個關卡(fmap在關卡的第二個元素上工作(如果你願意的話,你可以使用箭頭庫拼寫第二個元素),但是我們需要地圖來帶我們 – sclv
美麗我必須將'(map。fmap)'切換到'(fmap。map)',我認爲這很有道理,因爲我們正在映射元組的第二個元素。關於'fmap'和'second'的信息,我真的很感謝你的幫助! –