2016-09-01 15 views
10

Tôi có một số hoạt động nguyên thủy đơn giản, ví dụ:Có thể lưu trữ haskell "hoạt động" hoặc "đơn nguyên miễn phí" tiếp tục vào đĩa không?

Trong trường hợp operational đơn nguyên:

import Control.Monad.Operational 
type Process a = Program ProcessI a 
data ProcessI a where 
    GetInput :: ProcessI String 
    Dump :: String -> ProcessI() 
getInput :: Process String 
getInput = singleton GetInput 
dump :: String -> Process() 
dump = singleton . Dump 

Hoặc trong trường hợp free đơn nguyên:

import Control.Monad.Free 
type Process = Free ProcessF 
data ProcessF a 
    = GetInput (String -> a) 
    | Dump String a 
    deriving (Functor) 
getInput :: Process String 
getInput = liftF $ GetInput id 
dump :: String -> Process() 
dump s = liftF $ Dump s() 

hành động đơn giản là như nhau trong cả hai trường hợp, ví dụ:

proc1 :: Process() 
proc1 = forever $ do 
    a <- getInput 
    b <- getInput 
    dump $ a ++ b 
    dump $ b ++ a 

Câu hỏi của tôi là: Có thể diễn giải quá trình (proc1) theo cách mà việc tiếp tục trong một số bước nhất định được tuần tự hóa vào đĩa, sau đó được khôi phục trong quá trình thực thi chương trình tiếp theo? Bạn có thể vui lòng đưa ra một ví dụ?

Nếu không thể, giải pháp khắc phục gần nhất sẽ là gì?

Tôi muốn bắt đầu chương trình chỉ khi có đầu vào tiếp theo, áp dụng tiếp tục đầu vào, sau đó diễn giải cho đến khi "getInput" tiếp theo và thoát.

Tôi có thể tưởng tượng kịch bản để ghi lại tất cả các đầu vào, sau đó phát lại chúng để đưa hệ thống về trạng thái tương tự trước khi tiếp tục, nhưng trong trường hợp này, nhật ký sẽ phát triển không có giới hạn. Tôi không thể tìm thấy bất kỳ cách nào để campact đăng nhập trong thông dịch viên vì không có khả năng để so sánh tiếp tục (không có trường hợp EQ) và quá trình này là vô hạn.

+3

Không phải như vậy, tôi không nghĩ (mặc dù có thể một số đặc biệt GHC cho máy tính phân tán có thể làm được điều đó — Tôi chưa bao giờ đào sâu vào những thứ đó). Cách tiếp cận tiêu chuẩn tốt nhất có lẽ là trao đổi sự tiện lợi và tính tổng quát của lớp 'Monad' của Haskell cho phiên bản tùy chỉnh của riêng bạn đại diện cho các hàm trong một số ngôn ngữ trừu tượng mà bạn có thể giải thích. – dfeuer

Trả lời

5

Như tôi đã nhìn thấy nó, có hai vấn đề:

  • continuations có thể chứa các loại dữ liệu tùy ý

  • continuations có thể chứa các chức năng (tức là đóng cửa)

Đặc biệt trao ràng buộc thứ hai, có thể không có dễ dàng cách thực hiện chính xác những gì bạn muốn.

Cuộc thảo luận trên Can Haskell functions be serialized? trỏ tới thư viện có tên packman. Từ Readme:

... các chức năng có thể được sử dụng để tối ưu hóa các chương trình bằng cách memoisation (qua chương trình khác nhau chạy), và đến trạm kiểm soát thực hiện chương trình ở những nơi được chọn. Cả hai cách sử dụng đều được minh họa trong tập hợp trình chiếu được liên kết ở trên.

(The slides nó đề cập đến, tôi nghĩ.)

Hạn chế của phương pháp này là không tất cả loại dữ liệu có thể (hoặc nên!) Được tuần tự, các loại đặc biệt có thể thay đổi như IORef, MVar và STM liên quan đến các loại, và đôi khi những kết thúc trong khối và đóng cửa dẫn đến trường hợp ngoại lệ thời gian chạy.

Ngoài ra, thư viện dựa vào việc tiếp tục tuần tự được đưa lên bởi cùng một tệp nhị phân đã tạo ra nó có thể có hoặc không thực sự là vấn đề cho ứng dụng của bạn. Vì vậy, bạn có thể nhận được nhiều hơn hoặc ít hơn những gì bạn muốn với một cách tiếp cận hơi hạn chế và phức tạp như packman hoặc bạn có thể viết logic tùy chỉnh của riêng bạn.

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