【发布时间】:2014-01-18 12:02:40
【问题描述】:
我之前问过一个关于这个的问题,但我认为我真的不知道我在问什么。我想我现在对我的问题有了更好的理解。
我正在使用 netwire,一个带箭头的 FRP 库,但在实现这个箭头循环时遇到了一些麻烦。
我有
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]
(我有一个辅助函数selects :: [a] -> [(a,[a])],它将[x,y,z] 之类的东西变成[(x, [y,z]), (y, [x,z]), (x, [x,y])])
现在...我已经编译了这个硬编码版本,它已经可以正常工作并提供我最想要的结果。它运行时没有任何时髦的问题。
有谁知道是否有可能做这个“精确”的事情......但是使用一般数量的列表元素?
作为参考,我对selects 的实现来自 Simon Marlow,
selects :: [a] -> [(a,[a])]
selects = go []
where
go xs [] = []
go xs (y:ys) = (y,xs++ys) : go (y:xs) ys
【问题讨论】: