使用 Data.List.Ordered 库,我试图表达一个通过获取每个元素来扩展列表的函数,对其应用一个函数并将结果与原始元素一起收集而不重复,并重复该过程直到没有新元素创建的。现在看Data.Set,联合运算是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]