2013-02-05 51 views
2

我有一個深層嵌套的記錄,我試圖從數據庫重建。例如,A包含許多B記錄。 B記錄有很多C記錄。 C有很多D s。我有查詢每種類型對象(下面的f0,f1f2)的孩子的功能。使用箭頭生成深度嵌套記錄

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 

回答

3

這樣的事情應該工作(未經測試):

pairFun f = id &&& f 

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

編輯:順便說一句,想一想的一種方法是使用conal的語義編輯器組合器的模型 - http://conal.net/blog/posts/semantic-editor-combinators

+0

真棒,這絕對讓我更接近。不過,我的福式讓我失望了。我有'foo = fmap(map(pairFun f1))。這意味着'foo'現在具有'foo :: A - >(A,[(B,[C])])''的pairFun f0'。很近。我無法圍繞如何組合最後一個功能。想法? –

+0

@RJRegenold看到我的編輯。我忘記了我們在fmap中有兩個關卡(fmap在關卡的第二個元素上工作(如果你願意的話,你可以使用箭頭庫拼寫第二個元素),但是我們需要地圖來帶我們 – sclv

+0

美麗我必須將'(map。fmap)'切換到'(fmap。map)',我認爲這很有道理,因爲我們正在映射元組的第二個元素。關於'fmap'和'second'的信息,我真的很感謝你的幫助! –