Насколько ленив Haskell `++`?

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

Мне любопытно, как же ++ влияет на оптимизацию.Я бы предположил, что он создает ленивый преобразователь строки, который никогда не выполняет добавление, пока строка не будет прочитана так далеко. Таким образом, a никогда не следует добавлять к b , если минимум может исключить эту строку раньше, например, потому что она начинается с какой-то очень поздней буквы. Это правильно?

14
задан Jeff Burdges 15 January 2012 в 19:38
поделиться