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)
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)