Data.List.Ordered ライブラリを使用して、各要素を取得し、それに関数を適用して元の要素で結果を収集し、新しい要素がなくなるまでそれを繰り返すことで、リストを拡張する関数を表現しようとしました。作成した。さて、Data.Set を見ると、union 演算は O(n+m) で、Data.List.Ordered の nubSort は O(n) であるため、おそらく速度は向上しませんが、機能しませんでした。理由はわかりません。
import Data.List.Ordered --install data-ordlist
次の点を考慮してください。
nextimg:: Ord a => (a->a)->[a]->[a]
nextimg f x = nubSort $ union (map f x) x
ご了承ください
nextimg ((`mod` 3).(+1)) [1,2]
== nextimg ((`mod` 3).(+1)) [0,1,2]
== [0,1,2]
しかし、これを再帰的に実行しようとすると:
orbit:: Ord a => (a->a)->[a]->[a]
orbit f x = orbit f ( nubSort $ union (map f x) x )
その後、これは永久に実行されます:
orbit ((`mod` 3).(+1)) [1]