2011-12-07 32 views
7

Tôi đang viết biến áp luồng từ một số loại dữ liệu đầu vào thành kiểu dữ liệu đầu ra. Đầu vào được thực hiện bởi người dùng, do đó, có một số thời gian giữa các sự kiện. Bởi vì mỗi đầu vào yêu cầu tải tài nguyên, tôi muốn "xem xét tương lai", tức là gửi tất cả các yếu tố đầu vào có thể đến các tài nguyên tính toán và tải trước chính dựa trên kết quả.Có monads nào có thể được sử dụng như một automaton không?

Hiện tại, luôn có một đầu ra chính xác sau mỗi đầu vào nhưng cuối cùng nó có thể trở nên thú vị để thay đổi điều này.

Tôi đã thành công để triển khai điều đó với máy biến áp Automaton của Ross Paterson. Tôi không chắc giải pháp của tôi là tối ưu.

  • Có ví dụ hay về cách thực hiện việc này không? Có lẽ ngay cả với mã thử nghiệm?
  • Nó có thể đạt được với một đơn nguyên không? (Ví dụ ?, Giải thích lý do tại sao nó không thể?)

Chỉnh sửa: Sau khi gọi để biết thêm chi tiết, tôi đã thêm mã tại đây. Bây giờ tôi đang loại bỏ nó (nó không phải là dễ hiểu) và thêm một số lời giải thích khác. Câu hỏi của tôi được trả lời là thaugh.

Ý định của tôi là có vòng lặp sự kiện chính dừng sau mỗi lần nhập của người dùng đã được cấp cho máy biến áp mũi tên/luồng/bất kỳ thứ gì. Sau đó, nó sẽ lưu trữ trạng thái automaton hiện tại và gửi tất cả các đầu vào có thể (các sự kiện giả) từng cái một đến ô tô và xem tài nguyên nào phải được nạp, để lưu chúng. Sau sự kiện thực sự tiếp theo, nó sẽ sử dụng bộ nhớ cache để đáp ứng tốt hơn. Tính toán chính không nên bị ảnh hưởng bởi điều này.

+0

không đủ điều kiện để trả lời, nhưng lặp lại có thể hữu ích cho bạn. Xem thư viện này: http://hackage.haskell.org/package/enumerator ... nhưng mũi tên sẽ có vẻ trừu tượng tốt. Tôi sẽ đặt cược thêm chi tiết cụ thể sẽ giúp mọi người trả lời. – jberryman

+0

+1 về chi tiết cụ thể hơn. – sclv

Trả lời

8

Tất cả các trường hợp sử dụng mà bạn đã đề cập được bao phủ bởi thư viện Netwire. Nó cung cấp tổng quát về mũi tên tự động của Ross cho một họ có các mũi tên dây. Tôi chưa hoàn thành wiki page, nhưng nó sẽ cung cấp cho bạn đủ để bắt đầu.

Kết hợp điều này với Kleisli (LogicT m) đối với một số đơn lẻ m bạn nhận được các dây không xác định.

Và như một lưu ý bổ sung: Những gì bạn muốn không phải là một đơn nguyên.

+1

Hallo Ertes! Bạn có thể giải thích tại sao đây không phải là một đơn nguyên không? – Duschvorhang

+0

@Duschvorhang: mũi tên là khái quát hóa các monads. Xem [Haskell wiki> arrow] (http://haskell.org/haskellwiki/Arrow) –

+0

@Duschvorhang: bạn có thể thấy một giới hạn tương tự trong ví dụ phân tích cú pháp của §3.0 của John Hughes '[Tổng quát hóa Monads thành Mũi tên] (http: //www.ittc.ku.edu/Projects/SLDG/filing_cabinet/Hughes_Generalizing_Monads_to_Arrows.pdf) cùng với lời giải thích cẩn thận về cách mũi tên cung cấp tính biểu cảm cần thiết. Đó là một đọc tốt đẹp, bên cạnh đó. – acfoltzer

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