如何过滤列表中的索引?

时间:2019-11-20 19:51:25

标签: haskell functional-programming

例如,如果我有

的列表
  

[2,2,3,5,4,6]

我过滤偶数,我想输出这些数字的索引:

  

[1,2,5,6]

我知道filter函数返回元素。我该如何获取他们的索引呢? 我定义了功能索引,该索引将元素及其索引作为tuplet返回。有什么提示我应该继续吗?

index x = [ n | n <- [ zip x [1..]]]

2 个答案:

答案 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])
        )
    )

https://ideone.com/GDmW6j