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元素的大列表索引?
你最好不要使用其他模塊,只是使用前奏。
的問題不在於'elemIndex',但與'minimum',或者更確切地說,'最低。 reverse'。 – chepner
您可以編寫'[10000000,9999999..1]'。 'reverse'是這裏的問題,因爲它將整個列表保存在內存中。你有使用'reverse'的理由嗎? – sapanoia
@sapanoia被授予,雖然原則不應該是一個問題,保持在內存中的100 M條目列表。事實上,這隻會導致GHCi堆棧溢出;在編譯的程序中(即使沒有優化),它「僅僅」會使系統陷入19 GB的內存消耗... – leftaroundabout