Haskell: от векторов к распакованным векторам - PullRequest
0 голосов
/ 07 марта 2019

Сегодня я работал над преобразованием некоторого кода, который использовал 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, у меня возникла та же проблема, что и описанная ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...