2014-10-02 13 views
260

Tôi muốn nghiên cứu FRP trong Haskell, nhưng hơi khó để quyết định thư viện sử dụng. Nhiều người dường như đã chết, một số dường như đã được phục sinh (như hoạt động gần đây trên Yampa).Làm thế nào về cơ bản khác nhau là đẩy-kéo và FRP mũi tên?

Từ những gì tôi đọc, có vẻ như có hai "loại" FRP: push-pull FRP (như trong Reactive-banana) ở một bên và FRP mũi tên (như ở Yampa) ở phía bên kia. Có vẻ như cũng từng có một số "FRP cổ điển" vào thời điểm Fran và FrTime, nhưng tôi chưa phát hiện thấy bất kỳ hoạt động nào gần đây trong đó.

  • Có phải hai (hoặc ba) phương pháp tiếp cận cơ bản này thực sự khác nhau về FRP không?

  • Là một trong số chúng có lý thuyết lỗi thời trong khi phần còn lại sẽ là "nội dung của tương lai"?

  • Hoặc chúng phải phát triển song song, giải quyết các mục đích khác nhau?

  • Tôi đã đặt tên cho thư viện nổi bật nhất của từng danh mục hay có các tùy chọn khác để xem xét (Sodium, Netwire, et al)?


cuối cùng tôi xem talk from Evan Czaplicki đề nghị trong các ý kiến ​​của J. Abrahamson. Nó rất thú vị và đã giúp làm rõ mọi thứ cho tôi. Tôi rất khuyên bạn nên nó cho bất cứ ai tìm thấy câu hỏi này thú vị.

+5

Bạn có thể quan tâm đến ý kiến ​​của ertes '(tác giả của netwire): http://stackoverflow.com/a/13344292/414413 – Cirdec

+14

Thực sự nhanh chóng: 'phản ứng-chuối' chắc chắn là kéo dựa trên không đẩy-kéo. 'reactive' là push-pull. 'Yampa' và' netwire' được mũi tên. Có FRPs cho phép "tích lũy giá trị" nhưng không cho phép "chuyển đổi", FRPs cho phép "chuyển đổi" nhưng không "tích lũy giá trị". Cả hai đều là FRP "đơn giản". Arrowized FRP cho phép chuyển đổi và tích lũy và sử dụng các mũi tên để kiểm soát nguy cơ kết hợp các tính năng đó. Monadic FRP như 'reactive-banana',' sodium', và 'elerea' sử dụng các cơ chế cẩn thận khác để đảm bảo việc chuyển đổi và tích lũy không tương tác quá nhiều. –

+12

FRP mũi tên cũng có tính năng gọn gàng mà tín hiệu luôn được nêu trong ngữ cảnh đầu vào cho phép bạn chuyển đổi kết quả đầu ra covariantly và đầu vào contravariantly để mô phỏng FRP tương tác tốt hơn. Xem giao diện người dùng thực sự chức năng của Courtney và Elliott để có một ví dụ tuyệt vời về tính năng đó. –

Trả lời

15

Tôi đã thực hiện một chuyến đi đến Haskell.org để điều tra câu hỏi của bạn Tôi tìm thấy hai giấy tờ quan trọng bạn cần đọc để nghiên cứu thêm. Tôi đang xây dựng câu trả lời cho câu hỏi của bạn từ các tài liệu học thuật này.

Push-Pull FRP by Conal Elliott

Generalising Monads to Arrows by John Hughes


  1. Có, nhưng cũng không có. Theo Elliot, đẩy là đánh giá FRP theo hướng dữ liệu và kéo liên quan đến cái được gọi là đánh giá theo hướng "nhu cầu". Tác giả khuyên bạn nên kéo vì đẩy có xu hướng không hoạt động giữa các đầu vào dữ liệu. Đây là điểm mấu chốt: push-pull kết hợp và cân bằng các hành vi này với mục đích chính là giảm thiểu nhu cầu tính lại giá trị. Thật đơn giản; hoạt động FRP với push-pull đẩy nhanh khả năng phản ứng. Mũi tên là một kỹ thuật khác để sử dụng các loại trừu tượng để liên kết các giá trị và đánh giá chúng đồng thời. Tất cả những khái niệm này về cơ bản đều khác nhau. Nhưng đừng dùng từ ngữ của tôi cho nó:

    Bản chất của giao diện mũi tên là vấn đề với mục tiêu đánh giá lại tối thiểu. Các sự kiện và hành vi đầu vào được kết hợp thành một đầu vào duy nhất, sau đó thay đổi bất cứ khi nào bất kỳ thành phần nào thay đổi, (Elliott).

    Do đó, mũi tên mâu thuẫn với mục tiêu đẩy-kéo.Điều đó không có nghĩa là bạn không thể sử dụng tất cả những điều này cùng một lúc, chỉ là nó sẽ phức tạp, và có một số thứ bạn không thể tính toán mà không có các kiểu mũi tên trừu tượng.

  2. Tôi chưa tìm thấy ý kiến ​​học thuật về cách tiếp cận nào là "con đường của tương lai". Chỉ lưu ý rằng các mũi tên có thể xử lý đồng thời đặc biệt tốt. Nếu bạn có thể thực hiện các mũi tên và sử dụng push-pull để giảm thiểu tính toán, đó sẽ là con đường của tương lai.

  3. Có, chúng giải quyết các mục đích riêng biệt. Như tôi đã nói, chúng có thể được xây dựng với nhau nhưng rất khó để thực hiện và ngay cả khi nó hoạt động, nó có thể sẽ phủ nhận lợi ích tốc độ phản ứng của push-pull.

  4. Đó là chủ quan, nhưng Phản ứng và Yampa có vẻ là thư viện ngôn ngữ được trích dẫn phổ biến nhất cho FRP. Tôi sẽ nói Phản ứng của Conal Elliott có nguồn gốc sâu, và Yampa cũng được thành lập. Các dự án khác như Netwire phát sinh như là sự thay thế, nhưng nó có thể được một lúc trước khi họ thay thế những người khổng lồ.


Hope this helps! Giống như tôi đã nói đọc các bài báo tôi chỉ ra sẽ cho bạn một cảm giác tốt hơn về khoảng cách ngữ nghĩa giữa mũi tên, đẩy và kéo.

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