2016-12-03 171 views
0

我知道一些方法来查找最小或最大元素的索引,但是当我处理一个大列表时。 ghc说:“堆栈溢出”在Haskell中查找大元素的最小元素索引

所以我去堆栈溢出。

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元素的大列表索引?

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

+0

的问题不在于'elemIndex',但与'minimum',或者更确切地说,'最低。 reverse'。 – chepner

+0

您可以编写'[10000000,9999999..1]'。 'reverse'是这里的问题,因为它将整个列表保存在内存中。你有使用'reverse'的理由吗? – sapanoia

+0

@sapanoia被授予,虽然原则不应该是一个问题,保持在内存中的100 M条目列表。事实上,这只会导致GHCi堆栈溢出;在编译的程序中(即使没有优化),它“仅仅”会使系统陷入19 GB的内存消耗... – leftaroundabout

回答