查找数组中元素的索引 - Haskell

时间:2017-02-07 13:55:33

标签: haskell

我可以使用哪个函数来查找数组中元素的索引? 例如,我想在'x'Array

中找到Data.Array的索引
lowerCase = listArray ((0,0),(1,12)) ['a'..]

2 个答案:

答案 0 :(得分:1)

fst <$> find ((== 'a') . snd) $ assocs lowerCase

答案 1 :(得分:1)

要获取所有索引,某个元素会出现在Data.Array中,可以使用以下列表理解:

results = [fst x | x <- (assocs lowerCase), snd x == 'a']

assocs具有以下原型:

assocs :: Ix i => Array i e -> [(i, e)]

它基本上使包含Data.Array对的List中的(i, e)变平。 对于:

a = listArray ((0,0),(2,2)) ['a'..]

assocs a将输出

[((0,0),'a'),((0,1),'b'),((0,2),'c'),((1,0),'d'),((1,1),'e'),((1,2),'f'),((2,0),'g'),((2,1),'h'),((2,2),'i')]

现在,在列表理解中,我们有x <- (assocs a),因此x由列表assocs a生成。

列表推导输出的列表将仅包含fst x,其中

snd x == theElementWeAreLookingFor

检查由x生成的每个assocs a,如果满足条件snd x == 'a',则fst a(索引)将插入到输出列表中。

一旦生成列表,就可以检查是否没有,一个或多个输出。

getElementIndex :: Array (Int, Int) Char -> Char -> Maybe (Int, Int)
getElementIndex a e
   | null results = Nothing
   | othwerwise   = Just $ head results
   where results = [fst x | x <- (assocs a), snd x == e]

命令式伪码可能看起来像:

results = []

for_each x in a.toList():
   if x.second == 'a':
      results.append(x.first)