例如,如果我有
的列表[2,2,3,5,4,6]
我过滤偶数,我想输出这些数字的索引:
[1,2,5,6]
我知道filter
函数返回元素。我该如何获取他们的索引呢?
我定义了功能索引,该索引将元素及其索引作为tuplet返回。有什么提示我应该继续吗?
index x = [ n | n <- [ zip x [1..]]]
答案 0 :(得分:2)
在您的代码中,
index x = [ n | n <- [ zip x [1..] ] ]
[ n | n <- [ e ]]
等效于[ n | let n=e ]
等效于let n = e in [n]
,或者仅等效于[e]
,即[zip x [1..]]
。这不是你想要的。
The
index x = [ n | n <- ( zip x [1..] ) ]
另一方面,是不同的。括号用于分组,因此是多余的,在此可以省略。然后,该代码等效于[ n | n <- e ]
,这仅等效于e
,即zip x [1..]
,这更近了一步。
您只需要解构n
,它是一对元素和一个索引(由zip
构成),并在输出列表中包含一个索引(如果元素为偶数)。
我们通过模式匹配来解构值。
写成(a,b)
或(e,i)
等的配对模式。
答案 1 :(得分:0)
首先,您可以使用zip
给出列表的索引。从带有索引的列表中,我们可以filter
带有偶数值的列表。之后,我们可以提取值。
-- Will be (Value, Index) tuple
withIndex :: [Int] -> [(Int, Int)]
withIndex x = zip x [1..]
main =
print (
map snd (
filter
(even . fst)
(withIndex [2, 2, 3, 5, 4, 6])
)
)