2014-01-18 117 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

相关问题