在Haskell中查找min元素的大型列表索引

时间:2016-12-03 13:15:35

标签: haskell

我知道某种方法可以找到min或max元素的索引,但是当我处理大型列表时。 ghc说:“堆栈溢出”

所以我去堆栈溢出。

Prelude> :m Data.List
Prelude Data.List> let a = reverse [1..10000000]
Prelude Data.List> elemIndex  (minimum a) a
*** Exception: stack overflow

这种方法比使用elemIndex更好但是无法解决'reverse [1..100000000]'。

subset [] = [[]]
subset (x:xs) = s ++ map ( x : ) s
where s = subset xs

minIndex xs = snd . minimum $ zip xs [0..]

如何找到大型列表的min元素索引?

你最好不要使用其他模块,只使用前奏。

1 个答案:

答案 0 :(得分:1)

elemIndex (foldl1' min a) a

关键部分是使用foldl1' min代替minimumminimum的评估构建并返回一个巨大的redex,其评估会导致堆栈溢出。

所有血腥细节:https://wiki.haskell.org/Foldr_Foldl_Foldl%27

关于Haskell中性能严格性的一般性讨论:https://wiki.haskell.org/Performance/Strictness