在Haskell中查找列表中的元素索引?

Jon*_*FTW 28 indexing haskell list

我在Haskell中有一个函数,它从列表中找到取幂的最大值:

prob99 = maximum $ map (\xs -> (head xs)^(head (tail xs))) numbers
Run Code Online (Sandbox Code Playgroud)

我需要找到的是最终值在结果列表中的位置.我该怎么做?

编辑:我找到了一个像这样的解决方案:

n = [[519432,525806],[632382,518061]....
prob99b [a,b] = b* (log a)
answer = snd $ maximum (zip  (map prob99b n) [1..])
Run Code Online (Sandbox Code Playgroud)

yai*_*chu 35

如何找到最大元素的索引?如何尝试所有索引并检查它们是否是最大值?

ghci> let maxIndex xs = head $ filter ((== maximum xs) . (xs !!)) [0..]
Run Code Online (Sandbox Code Playgroud)

但这听起来像功能已经存在的东西.如果我使用现有函数,我的代码将更具可读性,可维护性,甚至可能更高效.

所以我应该问问怎么做,在15分钟内我会得到一个答案和一些讽刺的评论.或者 - 我可以请求hoogle并立即获得有用的响应(如Will所建议)

$ hoogle "Ord a => [a] -> Int" | head

<Nothing relevant>

$ # hmm, so no function to give me the index of maximum outright,
$ # but how about finding a specific element, and I give it the maximum?
$ hoogle "a -> [a] -> Int" | head
Data.List elemIndex :: Eq a => a -> [a] -> Maybe Int
Data.List elemIndices :: Eq a => a -> [a] -> [Int]
Run Code Online (Sandbox Code Playgroud)

  • 好吧,除了我之外,似乎每个人都出生了,现在不是他们.但实际上,我甚至不知道Hoogle存在,我仍在学习Haskell.下次我会更清楚的. (40认同)
  • @Jonno_FTW除非你准备好依赖它,否则不要开始使用Hoogle.作为一个经验丰富的Haskell程序员,我一旦确定了我正在尝试做的事情,就转向Hoogle.当我用Python编程时,这是一个问题,当我因为没有Poogle而感到沮丧时.:( (9认同)
  • @Jonno_FTW:我因为讽刺/愤世嫉俗而道歉.不是每个人都出生得很棒,有些人没有这样出生.你也可能变得很棒.Pythonesque编程中的一个好规则是:如果我发现我对同一个东西编码3次,也许我应该为它做一个函数.在Haskellesque编程中,常量是e而不是3.同样的规则也适用于元编程.如果您发现需要充分找到有用的功能,最好尝试找出是否有更好的方法来执行此功能搜索过程,然后发现Hoogle.mtfbwu (6认同)

Wil*_*ill 33

import Data.List
elemIndex 'b' "abc" === Just 1
Run Code Online (Sandbox Code Playgroud)

Hoogle是一个非常好的查找​​haskell函数的工具.允许您通过类型签名等搜索.

如果你想在一次传递中做所有事情,我建议使用Data.List.mapAccumL,将迄今为止找到的最大数字的索引作为累加器传递.


小智 8

这可能不值得他自己的答案,但我还不能发表评论.无论如何,这是我写这个的方式:

import Data.List
import Data.Ord

maxIndex ::  Ord a => [a] -> Int
maxIndex = fst . maximumBy (comparing snd) . zip [0..]
Run Code Online (Sandbox Code Playgroud)