过滤列表中的位置,Haskell

时间:2014-12-10 11:19:26

标签: haskell

我需要打印奇数索引的元素。目前是印刷指数。

我不明白如何打印此索引的元素?

f :: [Int] -> [Int]
f lst = filter odd [0..length lst]

-- I can't edit this part
main = do
   inputdata <- getContents
   mapM_ (putStrLn. show). f. map read. lines $ inputdata

6 个答案:

答案 0 :(得分:12)

如果你想“徒步”这样做:

odds [] = []
odds [x] = []
odds (e1:e2:xs) = e2 : odds xs

答案 1 :(得分:10)

您可以使用zip[Int]转换为[(Int, Int)],其中第一个元素是索引,第二个元素是原始值。然后,您可以使用fstsnd来获得所需的结果:

f :: [a] -> [a]
f lst = map fst $ filter (odd.snd) indexed where
    indexed = zip lst [0..]

请注意,无需将此限制为Int列表,它现在可以在任何类型的列表中使用:

> f "qwertyuiopasdfghjklzxcvbnm"
"wryipsfhkzcbm"

答案 2 :(得分:6)

Prelude> map snd $ filter (odd . fst) (zip [0 .. ] ["aa", "bb", "cc", "dd"])
["bb","dd"]

答案 3 :(得分:3)

我认为最短的是列表推导。

Prelude> let arr = [0..10]
Prelude> [j | (i, j) <- zip [0..] arr, odd i]
[1,3,5,7,9]

答案 4 :(得分:2)

f :: [Int] -> [Int]
f lst = [lst!!i|i<-[1..length lst],odd  i]

答案 5 :(得分:0)

我觉得比较优雅的f的另外两个实现是:

f lst = map (lst!!) [1, 3..(length lst)]

import Data.List.Split

f lst = concatMap (drop 1) (chunksOf 2 lst)