2014-10-25 15 views
9

Tôi vừa điều tra FRP trong Haskell (chủ yếu là reactive-banana (lời chứng thực!)), Và tôi tự hỏi là nó phổ biến đối với họ, và trong trường hợp phản ứng chuối là lý do để hoạt động trong IO là gì monad thay vì bị hạn chế để MonadIO, hoặc tốt hơn, bất kỳ Monad (để tôi có thể cung cấp ngăn xếp của riêng)?FRP frameworks và IO

Dường như với tôi đó là do tập trung vào lập trình GUI, nơi bạn tích hợp nó với một số thư viện hiện có hoạt động trong IO? Liệu nó có khả thi để thay đổi nó để tôi có thể tích hợp nó với ngăn xếp đơn lẻ không?

+0

Câu hỏi hay, tôi cũng tự hỏi tại sao phản ứng chuối lại đưa ra quyết định này. Bạn đã xem xét Yampa, họ đã đi một con đường khác. – martingw

+0

Không, chưa. Bây giờ tôi tự hỏi liệu tôi có thể làm theo cách của mình thông qua mã sourcecode phản ứng chuối và thay đổi mọi IO thành 'Monadio m' – Bartosz

Trả lời

4

Nếu bạn đang thắc mắc tại sao

reactimate :: Frameworks t => Event t (IO()) -> Moment t() 

hy vọng một sự kiện với giá trị của loại IO() thay vì cho phép một đơn nguyên tùy chỉnh M() với instance MonadIO M, thì câu trả lời là thế này:

Trong thực tế, tùy chỉnh đơn nguyên ngăn xếp chỉ thêm hiệu ứng nhà nước/đọc/ghi vào cơ sở IO đơn nguyên. Tuy nhiên, về lý thuyết, hoàn toàn có thể thêm cơ chế kiểm soát ưa thích như coroutines hoặc không xác định. Tôi không biết cách tích hợp trạng thái bên trong phát sinh từ các combinators accumE với các hiệu ứng tổng quát hơn, và tôi không biết ý nghĩa của nó cho một sự kiện xảy ra trong một ngữ cảnh không xác định. Đó là lý do tại sao reactimate bị giới hạn ở IO.

Nếu bạn có ngăn xếp đơn nguyên thuộc nhóm nhà nước/người đọc/nhà văn, thì thường có thể ánh xạ nó thành một phép tính thuần túy IO và sử dụng tính năng này với reactimate. Nếu bạn thấy rằng điều này không hiệu quả (tôi nghĩ rằng có thể có một vấn đề), tôi sẽ cần một mô tả chi tiết hơn về tình hình cụ thể để có thể giúp đỡ.

+0

hay không, lý do của tôi là như vậy nếu bạn (theo ví dụ về khe máy) gọi sự kiện bằng cách sử dụng' chức năng fire' mà chỉ trả về một hành động IO (và xử lý do đó hành động IO là tốt), sau đó nó sẽ có thể làm điều đó với monads khác. Tôi rõ ràng không có ý tưởng về chi tiết, vì vậy đây chỉ là linh cảm của tôi ... – Bartosz

+0

Vâng, bạn luôn có thể sử dụng 'liftIO' khi bạn gọi một sự kiện với' fire', nếu đó là ý của bạn. –

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