我需要打印奇数索引的元素。目前是印刷指数。
我不明白如何打印此索引的元素?
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
答案 0 :(得分:12)
如果你想“徒步”这样做:
odds [] = []
odds [x] = []
odds (e1:e2:xs) = e2 : odds xs
答案 1 :(得分:10)
您可以使用zip
将[Int]
转换为[(Int, Int)]
,其中第一个元素是索引,第二个元素是原始值。然后,您可以使用fst
和snd
来获得所需的结果:
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)