Сегодня я работал над преобразованием некоторого кода, который использовал Data.Vector
, в более «эффективный по памяти» Data.Vector.Unboxed
, когда внезапно обнаружил отсутствующий экземпляр.
Если я сделаю это в ghci
:
import qualified Data.Vector as V
V.singleton V.empty :: V.Vector (V.Vector Int)
[[]]
Это верно, вектор был напечатан правильно. Однако, если я попробую то же самое с Vector.Unboxed
:
import qualified Data.Vector.Unboxed as VU
:set -XFlexibleContexts
VU.singleton VU.empty :: VU.Vector (VU.Vector Int)
Я получаю ошибку:
<interactive>:10:1: error:
• No instance for (VU.Unbox (VU.Vector Int))
arising from a use of ‘VU.singleton’
• In the expression:
VU.singleton VU.empty :: VU.Vector (VU.Vector Int)
In an equation for ‘it’:
it = VU.singleton VU.empty :: VU.Vector (VU.Vector Int)
Что приводит меня к вопросу, как правильно реализовать распакованный вектор векторов?
Примечание:
Целью, которую я пытался достичь, была общая splitChunks
функция с основной предпосылкой разделения вектора на субвекторы фиксированного размера, очень примитивная реализация с использованием общих векторов была следующей:
-- With an arbitrary vector and a positive integer of known size it will create a vector that has splitted the original into sections. Example:
-- vec = [1,2,3,4,5,6,7,8,9,10]
-- size = 4
-- result = [[1,2,3,4],[5,6,7,8],[9,10]]
splitChunks :: V.Vector p -> Int -> V.Vector (V.Vector p)
splitChunks vec size
| size <= 0 = V.empty
| otherwise = fst $ until condition opr (V.empty, vec)
where condition = V.null . snd
opr (x, y) = let (l, r) = V.splitAt size y in (V.snoc x l, r)
Затем, когда я попытался перейти с Vector на Vector.Unboxed, у меня возникла та же проблема, что и описанная ранее.