2015-10-13 32 views
7

Ho un piccolo programma che deve essere eseguito ogni 5 minuti.Come eseguire un programma Haskell usando infinitamente solo Haskell?

Per ora, ho uno script di shell che esegue questa attività, ma voglio fornire all'utente la possibilità di eseguirlo senza ulteriori script tramite la chiave nella CLI.

Qual è il modo migliore per raggiungere questo obiettivo?

+0

CRON, nohup o configurarlo come servizio che può essere avviato. – mikeb

+1

Che cosa significa * via chiave in CLI * significa? –

+0

@mikeb Lo voglio in puro Haskell, l'utente potrebbe cambiare il tempo, come 3 minuti, 10 minuti quindi ho le chiavi in ​​CLI per farlo, ma non so come farlo funzionare correttamente. In C si potrebbe fare 'while (1) ...' –

risposta

9

Presumo che vorrà qualcosa di simile (pseudocodice più o meno):

import Control.Concurrent (forkIO, threadDelay) 
import Data.IORef 
import Control.Monad (forever) 

main = do 
    var <- newIORef 5000 
    forkIO (forever $ process var) 
    forever $ readInput var 

process var = do 
    doActualProcessing 

    interval <- readIORef var 
    _ <- threadDelay interval 

readInput var = do 
    newInterval <- readLn 
    writeIORef var newInterval 

Se è necessario passare alcuni dati più complessi dal thread di input per il thread di elaborazione, MVar s o TVar s potrebbe essere una scelta migliore di IORef s.

+0

grazie! Questo è quello che stavo cercando, non sapevo "per sempre" –

+0

@FilipvanHoft l'implementazione di forever è piuttosto semplice, ma solo chiamando ad es. 'process var' alla fine di' process' lo renderebbe anche ricorsivo all'infinito (quindi in loop). –

+1

Qualche motivo per scegliere 'TVar's invece di, ad esempio,' IORef's? C'è qualche problema di atomicità nel codice sopra? – chi