我需要编写一个函数来查找列表中某个特定元素的位置.我写的是这样的:
findPos list elt | list == [] = -1
| head list == elt = 0
| otherwise = 1 + (findPos (tail list) elt)
Run Code Online (Sandbox Code Playgroud)
但是如果元素在列表中重复的话怎么办?例如:list= [2,4,9,4,8]我想要元素"4"的位置,然后有2个位置:第二个和第四个.怎么会是一个简单的功能呢?
您应该为匹配的元素返回延迟评估的索引列表.
这样做的简单功能方法是首先使用zip [0..]第二个元素上的压缩列表过滤索引列表,然后最后删除第二个元素以保留索引.
-- first version
findPos list elt = map fst $ filter ((elt==).snd) $ zip [0..] list
-- second version, using list comprehensions
findPos list elt = [index | (index, e) <- zip [0..] list, e == elt]
Run Code Online (Sandbox Code Playgroud)
你可以让它返回一个索引列表.要使其工作,您需要在函数中更改一些内容:
findPos您应该创建一个辅助函数来获取计数器(从0开始)并将计数器增加1,而不是递归调用并将1加到结果中.但是,此功能已存在Data.List并被调用elemIndices.因此,除非这是一个纯粹的学习练习或家庭作业,否则你根本不需要重新实现.