2016-06-29 4 views
1

Прежде всего, я новичок в репае, и я все еще считаю себя новичком в Haskell в целом.Множество триплетов в repa проверено во время компиляции

Мне нужен эффективный массив триплетов двойников. Наивный подход будет [(Double, Double, Double)], но это не эффективно. Я думал, что смогу использовать репа, поскольку он должен быть очень эффективным. Однако я не знаю, как определить массив триплетов.

Я мог бы сделать Array U DIM2 Double и хранить элементы триплетов во втором измерении (то есть первый индекс является индексом триплета, а второй индекс является элементом триплета). Однако нет ничего, что заставило бы второй размер быть только размером 3.

Мне нужно что-то вроде Array U DIM1 Vec3D, но это невозможно, так как Vec3D не является экземпляром Data.Vector.Unboxed.Base.Unbox.

+0

Что не является «эффективным» в отношении '[(Double, Double, Double)]'? Скажите, пожалуйста, почему это не работает. Что относительно 'Array U DIM1 (Double, Double, Double)'? – crockeea

+0

@ Эрик Когда я сказал, что эффективный, я имел в виду эффективную вычислительную силу. Например, произвольный доступ к спискам Haskell - O (n). – zegkljan

ответ

3

Возможно, я читаю документацию неправильно, но я думаю, что Array U DIM1 (Double,Double,Double) - это именно то, что вы хотите (почему бы вам не попробовать?). Перед тем, как сказать мне, что это неэффективно:

  • Насколько я могу сказать, что нет никакого способа введения Array U sh u без ограничений Shape shиUnbox u. Поэтому любые Array U sh u обязательно будут эффективными и полностью распакованными.

  • В Unbox обратите внимание на экземпляр (Unbox a, Unbox b, Unbox c) => Unbox (a, b, c), поэтому Unbox (Double, Double, Double) является выводимым.

+0

Почему я не попробовал? Ну, потому что я идиот :). Спасибо. – zegkljan