返回列表中某个元素的所有位置而不进行递归,但使用列表生成器

时间:2015-11-15 15:43:15

标签: haskell recursion

我们被要求在Haskell中自己编写一个函数,当给定一个列表并且某个元素返回一个新列表时,该列表包含该列表中该元素的有序位置。

我已经尝试了很长时间了,但是我现在使用的那个仍然使用递归,任务说我们不应该使用递归。

allPositionsOf :: (Eq a) => a -> [a] -> [Int]
allPositionsOf e es = [i | i <- [0 .. (length es - 1)], IsAtPos e es i]
    where
         isAtPos :: (Eq a) => a -> [a] -> Int -> Bool
         isAtPos e (x:xs) 0 
                          |x == e    = True
                          |otherwise = False
         isAtPos e (x:xs) i   = findAtPosition xs e (i - 1)

我知道有!!和其他类似的功能,但是可以只使用列表生成器并使其更简单吗?

1 个答案:

答案 0 :(得分:5)

我想你想要这样的东西吗?

allPositionsOf :: Eq a => a -> [a] -> [Int]
allPositionsOf b xs = [ i | (i,x) <- zip [0..] xs, x == b]

λ> allPositionsOf 'b' "dfbhjbd"
[2,5]

你几乎已经得到了 - 我只是添加了一个技巧

zip [0,1,2,...]列表与(index,element)并排显示indizes和元素,拉出(i,x)对(此处为x == b),过滤掉add_torrent_params中的所有内容{1}}然后最终从对

返回indizes