首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于查找列表中元素位置的Haskell程序

用于查找列表中元素位置的Haskell程序
EN

Stack Overflow用户
提问于 2011-06-12 20:56:28
回答 4查看 9.2K关注 0票数 2

我需要编写一个函数来查找列表中某个特定元素的位置。我是这样写的:

代码语言:javascript
复制
findPos list elt | list == [] = -1
                 | head list == elt = 0
                 | otherwise = 1 + (findPos (tail list) elt)

但是在元素在列表中重复的情况下该怎么办呢?例如:list= [2,4,9,4,8]和I想要元素"4“的位置,然后有2个位置:第二个和第四个。怎么会是一个简单的函数呢?

EN

回答 4

Stack Overflow用户

发布于 2011-06-12 21:08:42

对于匹配的元素,您应该返回延迟计算的索引列表。

这样做的简单方法是首先使用zip [0..]对列表进行索引,然后在第二个元素上过滤压缩后的列表,最后删除第二个元素以保留索引。

代码语言:javascript
复制
-- 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]
票数 9
EN

Stack Overflow用户

发布于 2011-06-12 21:06:50

你可以让它返回一个索引列表。要实现这一点,您需要更改函数中的几项内容:

  1. 而不是-1为空的情况返回空列表(返回-1无论如何都是一个糟糕的习惯用法,你应该返回一个findPos,因为这更像是递归调用findPos并将1加到结果中,所以你应该创建一个接受计数器的辅助函数(从0开始),并将计数器增加1。
  2. 当你找到元素时,你应该返回计数器的当前值,而不是返回0,而不是返回0,而应该返回在列表尾部递归的结果前面的计数器的当前值(带有增加的计数器)。

但是,这个功能已经存在于Data.List中,并被称为elemIndices。因此,除非这是一个纯粹的学习练习或家庭作业,否则您根本不需要重新实现它。

票数 5
EN

Stack Overflow用户

发布于 2011-06-13 03:47:40

您还可以使用折叠:

代码语言:javascript
复制
findPos :: Eq a => a -> [a] -> [Int]
findPos elem = reverse . fst . foldl step ([],0) where
    step (is,i) e = (if e == elem then i:is else is, succ i) 

在命令式语言中,以一种感觉像while循环的方式编写代码是可能的,但却相当冗长:

代码语言:javascript
复制
findPos elem list = reverse $ thrd $ until finished step (list,0,[]) where
   finished (x,_,_) = null x
   step (e:es, c, acc) = (es, succ c, if e == elem then c:acc else acc) 
   thrd (_,_,x) = x 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6322053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档