Мне интересно, как мне следует улучшить производительность подпрограммы 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 предоставляет операции на месте, возможно, просто манипулируя некоторыми индексами в исходных данных. На самом деле мне не нужно беспокоиться о том, чтобы отслеживать индексы, чтобы избежать избыточного копирования, верно?
Мне любопытно, как ++
влияет на оптимизацию. Я бы предположил, что это создает ленивый струнный тон, который никогда не добавляет, пока строка не будет прочитана так далеко. Ergo, a
никогда не должен быть добавлен к b
, когда минимум может устранить эту строку раньше, например, потому что она начинается с более поздней буквы. Правильно ли это?