Haskell Repa --- функция выбора немного сбивает с толку - PullRequest
4 голосов
/ 05 июня 2011

Я немного запутался с функцией выбора в пакете repa:

select (\i -> True) (\i -> i) 10

дает результат

[0,1,2,3,4,5,6,7,8]

Я думал, что я между 0 и 10 или 0 и 9. Почему это между 0 и 8?

Репа 2.0.2.1

1 Ответ

5 голосов
/ 05 июня 2011

Похоже, он создает массив длиной len - 1, что в вашем случае равно 9.Что дает вам индексы в диапазоне [0-8].Я согласен, что документация может быть более понятной.

Если вы посмотрите на источник, select реализован в терминах selectChunkedP:

-- | Select indices matching a predicate, in parallel.
--   The array is chunked up, with one chunk being given to each thread.
--   The number of elements in the result array depends on how many threads 
--   you're running the program with.
selectChunkedP 
    :: forall a
    .  Unbox a
    => (Int -> Bool)    -- ^ See if this predicate matches.
    -> (Int -> a)       --   .. and apply fn to the matching index
    -> Int              -- Extent of indices to apply to predicate.

Видимо, 'степень индексов'для данного n включает все индексы x такие, что 0 <= x < (n-1):

Prelude Data.Array.Repa> extent $ select (const True) id 10
Z :. 9
...