2015-10-13 15 views
7

Tôi có chương trình nhỏ cần thực hiện sau mỗi 5 phút.Làm thế nào để chạy chương trình Haskell không ngừng chỉ sử dụng Haskell?

Hiện tại, tôi có tập lệnh shell thực hiện tác vụ đó, nhưng tôi muốn cung cấp khả năng của người dùng để chạy nó mà không có tập lệnh bổ sung qua khóa trong CLI.

Cách tốt nhất để đạt được điều này là gì?

+0

CRON, nohup hoặc thiết lập làm dịch vụ có thể bắt đầu. – mikeb

+1

* thông qua khóa trong CLI * có nghĩa là gì? –

+0

@mikeb Tôi muốn nó trong Haskell thuần túy, người dùng có thể thay đổi thời gian, như 3 phút, 10 phút vì vậy tôi có các phím trong CLI để làm như vậy, nhưng không biết làm thế nào để chạy nó đúng cách. Trong C bạn có thể thực hiện 'while (1) ...' –

Trả lời

9

Tôi đoán bạn sẽ muốn một cái gì đó như thế (giả nhiều hơn hoặc ít hơn):

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 

Nếu bạn cần phải vượt qua một số dữ liệu phức tạp hơn từ sợi đầu vào cho các chủ đề chế biến, MVar s hoặc TVar s có thể là lựa chọn tốt hơn so với IORef s.

+0

cảm ơn! Đó là những gì tôi đang tìm kiếm, tôi không biết về 'mãi mãi' –

+0

@FilipvanHoft việc triển khai vĩnh viễn là khá khó khăn, nhưng chỉ cần gọi điện thoại, ví dụ: 'process var' ở cuối' process' sẽ làm cho nó trở thành đệ quy vô hạn (do đó lặp lại). –

+1

Bất kỳ lý do nào để chọn 'TVar 'thay vì, nói' IORef'? Có một số vấn đề nguyên tử trong đoạn mã trên không? – chi

Các vấn đề liên quan