2014-01-18 113 views
0

我之前問過一個關於這個問題,但我不認爲我真的知道我在問什麼。我想我現在明白我的問題稍好一些。接線/箭頭列表中的每個元素與列表中的每個其他元素相同

我正在使用netwire,箭頭化的FRP庫,並且在實現此arrowloop時遇到了一些麻煩。

f :: ArrowLoop r => a -> r [a] a 
g :: ArrowLoop r => [a] -> r() [a] 

這樣g基本上捆綁使用f與所有其他元素的列表中給出的列表中的每個元素......嗯......這是很難用語言真的這麼說我「我要給一個例如具有長度爲4的列表:

g [x0, x1, x2, x3] = proc _ -> do 
    rec 
    y0 <- f x0 -< [y1, y2, y3] 
    y1 <- f x1 -< [y0, y2, y3] 
    y2 <- f x2 -< [y0, y1, y3] 
    y3 <- f x3 -< [y0, y1, y2] 
    returnA -< [y0, y1, y2, y3] 

(I有一個輔助函數selects :: [a] -> [(a,[a])],,輪流類似[x,y,z][(x, [y,z]), (y, [x,z]), (x, [x,y])]

現在...我編譯了這個硬編碼版本,這已經可以正常工作,並提供了我主要想要的結果。它運行時沒有任何時髦的問題。

有誰知道是否可以做到這一點「確切」的事情......但有一個列表元素的一般數量?


僅供參考,我的執行selects來自西蒙·馬洛,

selects :: [a] -> [(a,[a])] 
selects = go [] 
    where 
    go xs [] = [] 
    go xs (y:ys) = (y,xs++ys) : go (y:xs) ys 

回答

2

我無法測試這個正確的,因爲我沒有任何例子f運行它反對,但我相信這概括箭頭模式您有:

g :: ArrowLoop r => [a] -> r() [a] 
g = listLoop . map f 

listLoop :: ArrowLoop r => [r [a] a] -> r() [a] 
listLoop l = const [] ^>> go l where 
    go []  = arr (const []) 
    go (r:rs) = proc bs -> do 
     rec a <- r  -< bs ++ as 
      as <- go rs -< bs ++ [a] 
     returnA -< a : as 

所以首先我們用f映射得到箭頭名單,然後我們將它送到一個名爲listLoop的組合器,該組合器取得一個箭頭列表並定義一個與您的selects基本上具有相同邏輯的遞歸箭頭。 bs是來自r之前的箭頭的結果列表(類似於xsselects中)和as是來自r之後的箭頭的結果。對於每個r,我們輸入其他箭頭的結果,但不輸入r本身的結果(即a)。然後我們遞歸,在前面的結果列表中追加a

+0

編譯;我很抱歉,我不能說任何話,因爲它最終因爲某種原因而工作(我在計算中得到了很多NaN)。如果你願意,我可以得到一些簡單的網線,也許你可以從那裏去看看它爲什麼不起作用?然而,我感謝你的幫助。 –

+0

是的,如果你可以包含一些與你的硬編碼'g'和一些簡單的可運行'main'一起工作的例子,我會很樂意進一步調試它。 – shang

相關問題