我想知道如何改进一个Haskell程序的性能,该程序用于查找字符串的字典序最小循环旋转。
import Data.List
swapAt n = f . splitAt n where f (a,b) = b++a
minimumrotation x = minimum $ map (\i -> swapAt i x) $ elemIndices (minimum x) x
我认为应该使用Data.Vector而不是列表,因为Data.Vector提供了原地操作,可能只是操纵一些索引以访问原始数据。 我不需要跟踪索引以避免过多的复制,对吗?
但是,我很好奇++
会如何影响优化。 我想象它会产生一个惰性字符串thunk,直到读取到该位置时才进行追加。 因此,如果最小值可以尽早消除该字符串,例如因为它以某个较晚的字母开头,则a
实际上不会被添加到b
中。 正确吗?