以前、この件について質問したことがありますが、私が何を尋ねているのか本当にわかっていなかったと思います。私は自分の問題を少しよく理解していると思います。
私は矢印化された FRP ライブラリである netwire を使用していますが、この矢印ループを実装するのに問題があります。
私は持っている
f :: ArrowLoop r => a -> r [a] a
g :: ArrowLoop r => [a] -> r () [a]
g
基本的に、指定されたリスト内のすべての要素を他のすべての要素のリストと ...um... を使用して結び付けます...これ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