Làm thế nào khác nhau về cơ bản là đẩy-kéo và mũi tên FRP?


264

Tôi muốn học FRP ở Haskell, nhưng hơi khó để quyết định sử dụng thư viện. Nhiều người dường như là những nỗ lực chết chóc, một số dường như đã được hồi sinh (chẳng hạn như hoạt động gần đây trên Yampa).

Từ những gì tôi đọc được, có vẻ như có hai "loại" FRP: FRP kéo đẩy (như trong Reactive-Banana) ở một bên và FRP (như trong 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 của Fran và FrTime, nhưng tôi không phát hiện ra bất kỳ hoạt động nào gần đây trong những hoạt động này.

  • Đây có phải là hai (hoặc ba) cách tiếp cận thực sự khác nhau của FRP?

  • Là một trong số đó là lý thuyết lỗi thời trong khi cái còn lại sẽ là "công cụ của tương lai"?

  • Hay họ 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 mỗi danh mục, hoặc có các lựa chọn khác để xem xét (Natri, Netwire, et al)?


Cuối cùng tôi đã xem cuộc nói chuyện từ Evan Czaplicki được đề xuất trong các bình luận của J. Abrahamson. Nó rất thú vị và đã giúp làm rõ mọi thứ cho tôi. Tôi đánh giá cao nó cho bất cứ ai 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): stackoverflow.com/a/13344292/414413
Cirdec

14
Thực sự nhanh chóng: reactive-bananachắc chắn là dựa trên kéo không đẩy. reactivelà đẩy-kéo. Yampanetwiređược mũi tên. Có những FRP cho phép "tích lũy giá trị" nhưng không cho phép "chuyển đổi", FRP cho phép "chuyển đổi" nhưng không "tích lũy giá trị". Cả hai đều là FRP "đơn giản". Mũi tên FRP cho phép chuyển đổi và tích lũy và sử dụng mũi tên để kiểm soát sự nguy hiểm của việc kết hợp các tính năng đó. FRP đơn điệu như reactive-banana, sodiumelereasử dụng các cơ chế cẩn thận khác để đảm bảo rằng việc chuyển đổi và tích lũy không tương tác quá nhiều.
J. Abrahamson

12
Arrowized FRP cũng có một tính năng gọn gàng là các tín hiệu luôn được nêu trong ngữ cảnh đầu vào của chúng, cho phép bạn biến đổi các đầu ra một cách ngẫu nhiên và các đầu vào tương phản để 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 để biết ví dụ tuyệt vời về tính năng đó.
J. Abrahamson

9
Bạn cũng có thể quan tâm đến bài nói chuyện "Kiểm soát thời gian và không gian" của tác giả Elm, Evan Czaplicki. Theo tôi, anh ta quản lý để đưa ra một cái nhìn tổng quan cao cấp về không gian thiết kế FRP và các thỏa hiệp liên quan.
DanielM

3
Tôi nghĩ bạn sẽ nhận được câu trả lời của mình ở đây .. stackoverflow.com/questions/10000074/
Kẻ

Câu trả lời:


17

Tôi đã có một chuyến đi đến Haskell.org để điều tra câu hỏi của bạn Điều tôi tìm thấy là hai bài báo quan trọng bạn nên đọc để tiếp tục nghiên cứu và tôi đang xây dựng câu trả lời cho câu hỏi của bạn từ những bài báo học thuật này.

Đẩy-kéo FRP bởi Conal Elliott

Tổng quát hóa các đơn vị đến mũi tên của John Hughes


  1. Có, nhưng cũng không. Theo Elliot, đẩy là đánh giá FRP dựa trên dữ liệu và kéo liên quan đến đánh giá theo hướng "nhu cầu". Tác giả khuyến nghị kéo vì đẩy có xu hướng nhàn rỗi giữa các đầu vào dữ liệu. Đây là mấu chốt: kết hợp kéo đẩy và cân bằng các hành vi này cho mục đích chính là giảm thiểu nhu cầu tính toán lại các giá trị. Thật đơn giản; vận hành FRP với lực đẩy đẩy nhanh khả năng phản ứng. Mũi tên là một kỹ thuật khác nhau để 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ả các khái niệm này về cơ bản là khác nhau. Nhưng đừng hiểu ý tôi:

    Bản chất của giao diện Mũi tên là có vấn đề cho 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 đó, Arrow 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 thứ 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 nếu không có các loại Mũi tên trừu tượng.

  2. Tôi đã không 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 mũi tên có thể xử lý tính đồ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 kéo đẩy để giảm thiểu tính toán, đó sẽ là cách của tương lai.

  3. Vâng, họ giải quyết các mục đích riêng biệt. Như tôi đã nói, chúng có thể được tạo thành cùng 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 kéo đẩy.

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


Hi vọng điêu nay co ich! Giống như tôi đã nói đọc các bài báo tôi đã chỉ ra sẽ cho bạn cảm nhận rõ hơn về khoảng cách ngữ nghĩa giữa mũi tên, đẩy và kéo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.