これはすでによく、私は待っていなかった... length $ subsets [1..25]
がかかる中に、数秒でlength $ subsets' [1..25]
を計算できるようになります。)
*Main> take 100 $ subsets'' [1..]
[[],[1],[2],[2,1],[3],[3,1],[3,2],[3,2,1],[4],[4,1],[4,2],[4,2,1],[4,3],[4,3,1],[4,3,2],[4,3,2,1],[5],[5,1],[5,2],[5,2,1],[5,3],[5,3,1],[5,3,2],[5,3,2,1],[5,4],[5,4,1],[5,4,2],[5,4,2,1],[5,4,3],[5,4,3,1],[5,4,3,2],[5,4,3,2,1],[6],[6,1],[6,2],[6,2,1],[6,3],[6,3,1],[6,3,2],[6,3,2,1],[6,4],[6,4,1],[6,4,2],[6,4,2,1],[6,4,3],[6,4,3,1],[6,4,3,2],[6,4,3,2,1],[6,5],[6,5,1],[6,5,2],[6,5,2,1],[6,5,3],[6,5,3,1],[6,5,3,2],[6,5,3,2,1],[6,5,4],[6,5,4,1],[6,5,4,2],[6,5,4,2,1],[6,5,4,3],[6,5,4,3,1],[6,5,4,3,2],[6,5,4,3,2,1],[7],[7,1],[7,2],[7,2,1],[7,3],[7,3,1],[7,3,2],[7,3,2,1],[7,4],[7,4,1],[7,4,2],[7,4,2,1],[7,4,3],[7,4,3,1],[7,4,3,2],[7,4,3,2,1],[7,5],[7,5,1],[7,5,2],[7,5,2,1],[7,5,3],[7,5,3,1],[7,5,3,2],[7,5,3,2,1],[7,5,4],[7,5,4,1],[7,5,4,2],[7,5,4,2,1],[7,5,4,3],[7,5,4,3,1],[7,5,4,3,2],[7,5,4,3,2,1],[7,6],[7,6,1],[7,6,2],[7,6,2,1]]
ありがとう!それはモナドの解です。彼らなしではどうですか? – Gilgamesz
@Gilgameszはモナドが必要でもないことが判明しました。とにかく以前のバージョンは間違っていました - 今は普通のリストで動作し、うまくいけば正しく動作します。 – phg
@Gilgamesz怠惰は、ハスケルの中核であるが、最も高度なトピックの1つです。例えば、phgの最初の点は、グラフの構造を使って進行中の評価を表す、ハーケルの具体的な怠惰の実装の結果です。IIRC、いくつかの限られたケースでは、コンパイラ*は重複をキャッチし、同じデータ構造を両方のインスタンス---必ずしもそうではありません。これは怠け者のために支払う価格の1つです。パフォーマンスに焦点を当てるときや無限大を扱うときには、コンパイラの限界があります。 – jpaugh