我可以使用哪个函数来查找数组中元素的索引?
例如,我想在'x'
(Array
)
Data.Array
的索引
lowerCase = listArray ((0,0),(1,12)) ['a'..]
答案 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)