Là biểu thức tính toán giống như đơn nguyên?


22

Tôi vẫn đang học lập trình chức năng (với f #) và gần đây tôi đã bắt đầu đọc về các biểu thức tính toán. Tôi vẫn chưa hiểu đầy đủ về khái niệm này và một điều khiến tôi không chắc chắn khi đọc tất cả các bài viết liên quan đến các đơn nguyên (hầu hết chúng được viết dựa trên Haskell) là mối quan hệ giữa các biểu thức tính toán và các đơn nguyên.

Đã viết tất cả, đây là câu hỏi của tôi (thực sự là hai câu hỏi):

Có phải mọi biểu thức tính toán F # là một đơn nguyên? Mỗi đơn nguyên có thể được biểu thị với biểu thức tính toán F # không?

Tôi đã đọc bài đăng này của Tomas Petricek và nếu tôi hiểu rõ về nó, nó nói rằng các biểu thức tính toán nhiều hơn các đơn nguyên, nhưng tôi không chắc liệu tôi có giải thích chính xác điều này không.


@Raphael tôi có thể hỏi lý do để xóa thẻ lang là gì không?
Grzegorz Sławecki

2
Vì chúng tôi quan tâm đến các khái niệm, chúng tôi cố gắng giữ hầu hết mọi thứ không liên quan đến ngôn ngữ ở đây. Tôi không biết loại bỏ F # nào cho câu hỏi ( Tôi nghĩ rằng nếu điều quan trọng là F # thì câu hỏi không chính đáng ở đây, nhưng đó là trường hợp đường biên giới) vì vậy tôi chỉ xóa thẻ F #. Nguyên tắc chung: F # không phải là một khái niệm CS, vì vậy nó không cần thẻ. (Vâng, tôi biết về các thẻ PL khác và tôi cũng không thích chúng. Đối với một số câu hỏi, cộng đồng đã quyết định rằng họ đảm bảo các thẻ này.)
Raphael

1
@Raphael Tôi tin rằng câu hỏi thực sự là một trường hợp biên giới. Ai đó đã quyết định di chuyển nó ở đây nhưng có vẻ như nó hơi lạc đề ở đây. Bản thân câu hỏi là loại máy tính, nhưng đồng thời cả câu trả lời và câu hỏi đều liên quan cụ thể đến f #. Tôi hiểu quy tắc của bạn, cảm ơn bạn đã làm rõ.
Grzegorz Sławecki

Câu trả lời:


22

Trước hết, biểu thức tính toán là một tính năng ngôn ngữ, trong khi monads là trừu tượng toán học, vì vậy từ quan điểm này, họ là hoàn toàn khác nhau điều .

Nhưng đó không phải là một câu trả lời rất hữu ích :-). Biểu thức tính toán là một tính năng ngôn ngữ cung cấp cho bạn một cú pháp có thể được sử dụng để lập trình với các tính toán (hoặc kiểu dữ liệu) có cấu trúc đơn âm, nhưng chúng cũng có thể được sử dụng với các cấu trúc khác. Bạn có thể đọc bài viết về sở thú biểu hiện tính toán F # của tôi để biết thêm chi tiết, nhưng các biểu thức tính toán có thể được sử dụng với:

  • Monads, nhưng cũng là monads phụ gia (những gì Haskeller gọi MonadPlushoặc MonadOr)
  • Tính toán tổng hợp (cái mà Haskeller gọi là máy biến áp đơn nguyên)
  • Các tính toán đơn điệu, nhưng hỗ trợ các cấu trúc F # khác như xử lý ngoại lệ
  • Đơn sắc (và một vài biến thể không có liên kết đơn âm)
  • Functor ứng dụng (mặc dù điều này chỉ được thực hiện trong một phần mở rộng nghiên cứu)

Vì vậy, các biểu thức tính toán chắc chắn được liên kết chặt chẽ với các đơn nguyên, nhưng chúng không được liên kết chặt chẽ với chúng. Điều này trái ngược với ví dụ với doký hiệu của Haskell , liên kết chặt chẽ hơn nhiều với các đơn nguyên (mặc dù thậm chí có thể được sử dụng với các tính toán không phải là đơn nguyên toán học nghiêm ngặt).


3
Máy biến áp đơn nguyên là một cách chung để chuyển đổi một đơn nguyên thành đơn nguyên khác - các biểu thức tính toán F # chỉ thực sự hỗ trợ trực tiếp thực hiện / kết quả / của phép biến đổi đó, chứ không phải là chính phép biến đổi.
GS - Xin lỗi đến

1
@GaneshSittampalam - Vâng, bạn đã đúng. Nỗ lực của tôi để đơn giản hóa không phải là tất cả hữu ích ở đây :-). Các biểu thức tính toán có thể cung cấp cho bạn một cú pháp để làm việc với một tính toán là kết quả của việc áp dụng một biến áp đơn nguyên (với cú pháp có khả năng khác nhau cho đơn nguyên cơ bản và cho đơn nguyên sáng tác)
Tomas Petricek

5

Bạn có thể sử dụng các biểu thức tính toán để thể hiện các đơn nguyên. Có một ví dụ ở đây . Ngoài ra, như bạn đã lưu ý, bạn có thể sử dụng các biểu thức tính toán cho nhiều thứ hơn là chỉ các đơn nguyên. Có một lời giải thích mở rộng về cách chúng khác nhau ở đây . Không có không gian ở đây để giải thích sự khác biệt một cách chính xác, nhưng các biểu thức tính toán khác với các đơn nguyên ở chỗ chúng sử dụng lại cú pháp F # bình thường và có khả năng thêm các tóm tắt bổ sung. Một hạn chế là nó không phải là thành ngữ (và khó) để viết biểu thức tính toán là đa hình so với loại tính toán.


1
Vui lòng làm cho câu trả lời của bạn trở nên khép kín hơn bằng cách ít nhất là tóm tắt tài liệu trên các trang bạn liên kết đến. Câu trả lời hiện tại của bạn sẽ hoàn toàn vô nghĩa nếu hai liên kết ngừng hoạt động.
David Richerby

2
Tôi không chắc những gì bạn đang nói về. Tôi trả lời rõ ràng các câu hỏi và sau đó đưa ra liên kết đến nhiều thông tin hơn nếu người hỏi quan tâm. Các liên kết là không cần thiết để trả lời câu hỏi.
N_A

1
Tôi thậm chí không thể tưởng tượng rằng hai liên kết có thể ngừng hoạt động :-)
Tomas Petricek
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.