2012-02-08 12 views
6

2つの関数f :: [a] -> bg :: [a] -> cがあるとします。私が実行した場合提示されたケースを1つのループに最適化することは可能ですか?

  1. (f &&& g) xsどこxs :: [a]、両方fgはループを伴う場合、コンパイラは一つにこれら二つのループを最適化するために、それが可能である:私は、次の2つの質問がありますか? (私はいくつかの特定のHaskellのコンパイラは、私はそのようなことが可能であるかどうかを知りたい。これを実装しているかどうかを尋ねておりませんのでご注意ください。)

  2. Traverse型クラスからtraverse機能は私がして、このような最適化を持って助けることができます以下の線に沿って何か:fgは、入力リストの異なる量を消費する可能性があるため、

    traverse (someCombinator f g) xs 
    
+0

1.のような最適化はスーパーコンパイラで実行できると思います。 – Landei

答えて

9

このコードを最適化することは理論的には可能であるが、非常に非常に難しいです。同じ量を消費する場合、またはgは常にf(またはその逆)より多くのリストを消費するため、最適化を実行できます。停止問題は、複雑なコードでコンパイラがそのような条件を検出できないようにします。

たとえば、fgの両方が内部でfoldrを使用する単純な場合にのみ、さらにイントロスペクションを行うことなく簡単な最適化を実行できます。 someCombinatorを実施するための合理的な方法がないので

traverse関数は(どのように深刻なハックせずに1 [a]a年代の複数の呼び出しを変換したいのですか?そして、あなたはスタート地点、あなたが戻って、ここであなたを助けにはなりませんいずれかの方法)。

あなたの唯一の現実的な選択肢は、彼らがbcの値が増分的に計算することができることを意味し、署名f :: a -> b -> bg :: a -> c -> cを持っているように、フォルダにfgを作ることです。 \ a -> f a *** g aを使用して、通常の(この場合は)折り畳みで使用できるフォルダを取得できます。

+0

偉大な答え。どうもありがとう!私はこの質問を投稿したので、私は[このスレッド](http://stackoverflow.com/questions/9162256/cartesian-product-traverse-in-scalaz/9162706#9162706)(答えとコメントで)正しいものでした。 – missingfaktor

関連する問題