我们被要求在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)
我知道有!!和其他类似的功能,但是可以只使用列表生成器并使其更简单吗?
答案 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}}然后最终从对