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

jul*_*lia 1 haskell

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

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个位置:第二个和第四个.怎么会是一个简单的功能呢?

Kru*_*Kru 9

您应该为匹配的元素返回延迟评估的索引列表.

这样做的简单功能方法是首先使用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)


sep*_*p2k 5

你可以让它返回一个索引列表.要使其工作,您需要在函数中更改一些内容:

  1. 而不是-1返回空列表的空列表(无论如何返回-1是一个不好的习惯用法,你应该返回一个Maybe而不是因为那更有意义).
  2. findPos您应该创建一个辅助函数来获取计数器(从0开始)并将计数器增加1,而不是递归调用并将1加到结果中.
  3. 当您找到元素而不是返回0时,您应该返回计数器的当前值,该值在列表尾部的递归结果之前(使用增加的计数器).

但是,此功能已存在Data.List并被调用elemIndices.因此,除非这是一个纯粹的学习练习或家庭作业,否则你根本不需要重新实现.