我们被要求在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)
我知道有!和其他功能相似,但是是否可以仅使用列表生成器并使它更简单?
我想你想要类似的东西吗?
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,...]
并排的indize和元素并排,取出一(index,element)
对(在此处(i,x)
),过滤掉所有内容,x == b
然后最终从对中返回indize
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句