从指定的坐标和方向获取2D Array中的n个元素

时间:2017-06-16 14:30:43

标签: haskell

我有x,y坐标和char元素的数组。我需要函数来获取指向坐标的n个字符列表。我是经常性地写的:

import Data.Array

exampleArray = array ((1,1),(2,2)) [((1,1),'a'), ((1,2),'b'), ((2,1),'c'), ((2,2),'d')]
--       1   2  
--     +---+---+
--   1 | a | b |
--     +---+---+
--   2 | c | d |
--     +---+---+

f :: Array (Int, Int) Char -> Int -> (Int, Int) -> (Int, Int) -> [Char]
f _ 0 _ _ = []
f arr n (x,y) (dirX, dirY) = (arr ! (y,x)) : f arr (n-1) (x+dirX,y+dirY) (dirX, dirY)

-- ac
list = f exampleArray 2 (1,1) (0,1) -- get 2 chars from array at 1,1 toward E

-- cb
list2 = f exampleArray 2 (1,2) (1,(-1)) -- get 2 chars from array at 1,2 toward NE

它有效,但它太慢了,我想知道如何优化它?

1 个答案:

答案 0 :(得分:1)

Array速度很慢,因此您的第一步应该是移至vector package。使用未装箱的版本,作为默认的"盒装"表示为每个值分配堆存储并存储指向它的指针。没有2-d向量这样的东西,所以你必须编写代码来将坐标对转换为1-d向量中的位置。如果仍然不够快,那么使用unsafeIndex函数及其亲属进行访问,这些函数不会进行边界检查(但不要调用你cannot put down的那个)。 / p>

另见this question