2016-01-09 11 views
14

Per esempio:Haskell scartare una scintilla quando il thunk viene raccolto?

x :: Maybe a 
y :: a 
y `par` x `pseq` (fromMaybe y x) 

è la scintilla di y fermato e scartato se x viene calcolata (molto) prima ed è Just ...?

Per essere più specifici, voglio cercare un elenco, ma ogni confronto è piuttosto costoso. Mi piacerebbe parallelizzare la ricerca, ma vorrei che il resto dei confronti venisse scartato una volta trovata una corrispondenza.

risposta

4

Intendevi fromMaybe anziché maybe?

x `par` y `pseq` (fromMaybe y x) 

Inoltre si sta creando una scintilla per la valutazione x, non y. Pertanto, fromMaybe y x non verrà valutato fino alla valutazione di . Probabilmente volevi dire il contrario:

y `par` x `pseq` (fromMaybe y x) 

Se tutto sopra è vero, allora la risposta alla tua domanda è "no", la scintilla non verrà fermato quando già iniziato (anche se verrà scartato se non ancora iniziato.) è possibile controllare con il seguente test:

import Data.Maybe 
import Control.Concurrent 
import Control.Parallel 
import System.IO.Unsafe 
import System.Mem 

{-# NOINLINE x #-} 
x = unsafePerformIO $ do 
    threadDelay 1000 
    return (Just 1) 

{-# NOINLINE y #-} 
y = unsafePerformIO $ do 
    print "will eval y" 
    threadDelay 3000000 
    print "did eval y" 
    return (2 :: Int) 

main :: IO() 
main = do 
    print $ y `par` x `pseq` fromMaybe y x 
    print "done" 
    performGC 
    threadDelay 4000000 

l'output:

"will eval y" 
1 
"done" 
"did eval y" 

Inoltre è possibile controllare le statistiche di runtime, +RTS -s. Contiene un numero di scintille GC'd.

+0

Sì, hai corretto i miei errori proprio come avrebbe dovuto essere :), grazie! Quindi suppongo che per terminare i compiti devo ricorrere all'utilizzo della concorrenza e uccidere manualmente i thread con 'killThread'. –