Я проводил много исследований в Data Parallel Haskell и нашел два отдельных типа параллельных массивов. Тип [::]
, похоже, больше проявляется в исследовательских работах и, по-видимому, является идеальным типом, но PArray
, кажется, застрял повсюду. Страница вики на эту тему очень четко показывает, что массивы типа [::]
не могут быть переданы в невостребованный код. Зачем? Почему существует этот промежуточный тип PArray
? Мне кажется совершенно лишним. Вики называет его "плоским массивом", но вся точка векторизации заключается в том, чтобы сделать параллельные массивы плоскими.
Обновление: после чтения большего количества документов и документации и исходного кода я еще более запутан. [::]
или его синоним PArr
, по-видимому, реализованы в GHC.PArr как плоский массив, а PArray
- промежуточный тип, который называется "плоской" в нескольких местах, реализован в Data.Array.Parallel.PArray.Base и других модулях, импортированных оттуда в качестве семейства данных, используя преобразование сплющивания, описанное во многих документах, которые я читал. Почему плоские массивы не плоские, а вложенные плоские?
Обновление 2: после дополнительных исследований я обнаружил, что подкрепление является полным беспорядком. Страница wiki не обновляла контент за почти год, противоречит документации по hackage (см. Data.Array.Parallel.Prelude, где он явно говорит не импортировать специальную прелюдию), и просто устарел. Страница GHC.PArr:
-- BIG UGLY HACK: The desugarer special cases this module. Despite the uses of '-XParallelArrays',
-- the desugarer does not load 'Data.Array.Parallel' into its global state. (Hence,
-- the present module may not use any other piece of '-XParallelArray' syntax.)
--
-- This will be cleaned up when we change the internal represention of '[::]' to not
-- rely on a wired-in type constructor.
Я полагаю, что, когда включена векторизация, этот модуль автоматически заменяется другим представлением, которое использует преобразование сглаживания. Это может даже быть чем-то вроде
type [::] = PArray
решая мою оригинальную проблему. Однако не только последнее имеет смысл (почему ограничение [::]
на тип плоского массива при отключении векторизации?), Но я не нашел доказательств, подтверждающих любую теорию, кроме упомянутого выше комментария. Кажется, что единственный надежный способ узнать что-либо - это посмотреть на источник GHC, который, учитывая его размер и сложность, - это то, что я очень хочу сделать, даже если бы я был уверен, что добьюсь успеха.