6

Hãy tưởng tượng một (tạo thành) bằng ngôn ngữ đơn giản mà các chức năng như sau:Có mối quan hệ nào giữa việc gọi một hàm và khởi tạo một đối tượng bằng các ngôn ngữ chức năng thuần túy không?

function f(a, b) = c + 42 
    where c = a * b 

(Giả sử đó là một tập hợp con của Lisp bao gồm 'defun' và 'let'.)

Cũng tưởng tượng rằng nó bao gồm bất biến đối tượng trông giống như:

struct s(a, b, c = a * b) 

Again analogizing để Lisp (thời gian này một superset), nói một định nghĩa struct như thế sẽ tạo ra các chức năng để:

make-s(a, b) 
s-a(s) 
s-b(s) 
s-c(s) 

Bây giờ, với thiết lập đơn giản, có vẻ như rõ ràng rằng có rất nhiều điểm giống nhau giữa những gì xảy ra đằng sau hậu trường khi bạn gọi 'f' hoặc 'make-s'. Khi 'a' và 'b' được cung cấp tại thời gian gọi/instantiate, có đủ thông tin để tính 'c'.

Bạn có thể nghĩ đến việc khởi tạo cấu trúc giống như gọi hàm, sau đó lưu trữ môi trường biểu tượng kết quả để sử dụng sau này khi các hàm truy cập được tạo được gọi. Hoặc bạn có thể nghĩ về việc đánh giá một hàm giống như tạo một cấu trúc ẩn và sau đó sử dụng nó làm môi trường biểu tượng để đánh giá biểu thức kết quả cuối cùng.

Mô hình đồ chơi của tôi quá đơn giản đến nỗi nó vô dụng? Hay thực sự là một cách hữu ích để suy nghĩ về cách ngôn ngữ thực sự hoạt động như thế nào? Có bất kỳ ngôn ngữ/triển khai thực sự nào mà một người không có nền tảng CS nhưng có quan tâm đến ngôn ngữ lập trình (tức là tôi) nên tìm hiểu thêm về để khám phá khái niệm này không?

Cảm ơn.

EDIT: Cảm ơn bạn đã trả lời cho đến thời điểm này. Để xây dựng một chút, tôi đoán những gì tôi đang tự hỏi là nếu có bất kỳ ngôn ngữ thực sự mà nó là trường hợp mà mọi người học ngôn ngữ được cho biết ví dụ "bạn nên nghĩ về các đối tượng như là bản chất đóng cửa". Hoặc nếu có bất kỳ triển khai ngôn ngữ thực nào trong trường hợp instantiating một đối tượng và gọi một hàm thực sự chia sẻ một số mã lệnh hoặc cấu trúc dữ liệu phổ biến (không tầm thường).

Liệu sự tương tự tôi đang làm, mà tôi biết những người khác đã thực hiện trước đây, đi sâu hơn so với tương tự trong bất kỳ tình huống thực tế nào?

+0

Vâng, chắc chắn có sự tương tự. 'make-s' có thể được xem là nhà máy, theo định nghĩa là một hàm. Và tôi thực sự thấy nó thú vị, mặc dù không quá liên quan đến code-fu của tôi, để suy nghĩ về các phương thức (bao gồm các nhà máy/nhà thầu) như các hàm và phạm vi của hàm như một ánh xạ biểu tượng (/ string) => value. Python làm cả hai. 1 vì tôi thích những thứ như vậy. – delnan

+0

Loại liên quan: http://stackoverflow.com/questions/2497801/closures-are-poor-mans-objects-and-vice-versa-what-does-this-mean – missingfaktor

Trả lời

1

Cả fmake-s là chức năng, nhưng sự giống nhau không tiến xa hơn nữa. Áp dụng f gọi hàm và thực thi mã của nó; áp dụng make-s tạo cấu trúc.

Trong hầu hết các trường ngôn ngữ và modelizations, make-s là một loại khác nhau của đối tượng từ f: f là một đóng cửa, trong khi make-s là một constructor (trong ngôn ngữ chức năng và ý nghĩa logic, đó là gần với đối tượng ngôn ngữ hướng có nghĩa) .

Nếu bạn muốn suy nghĩ theo cách hướng đối tượng, cả hai kiểu fmake-s đều có phương pháp áp dụng, nhưng chúng có các cách triển khai hoàn toàn khác nhau của phương pháp này.

Nếu bạn muốn suy nghĩ về logic cơ bản, fmake-s có kiểu xây dựng trên hàm tạo kiểu samme (hàm tạo hàm), nhưng chúng được tạo theo nhiều cách khác nhau và có các quy tắc hủy khác nhau (ứng dụng hàm so với ứng dụng hàm dựng).

Nếu bạn muốn hiểu đoạn cuối, tôi khuyên bạn nên Types and Programming Languages bởi Benjamin C. Pierce. Các cấu trúc được thảo luận trong §11.8.

+0

Đây cũng là một câu trả lời rất hữu ích. – jtolle

+0

Mặc dù tôi đã chấp nhận câu trả lời này bởi vì tôi nghĩ rằng nó trực tiếp nhất nhận được những gì tôi đã tự hỏi, tôi muốn làm nổi bật câu trả lời từ @dave dưới đây. Giữa hai người, tôi nghĩ rằng an toàn để nói rằng câu trả lời là "không có ngôn ngữ nào bạn phát triển được thực hiện theo cách này, nhưng một cái gì đó đủ sánh (giống như một thông dịch viên lambda) cũng có thể là". – jtolle

1

Có mối quan hệ giữa các đối tượng và đóng cửa. http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg03277.html

Sau đây tạo mà một số người gọi một chức năng, và những người khác có thể gọi là một đối tượng:
Taken từ SICP (http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-21.html)

(define (make-account balance) 
    (define (withdraw amount) 
    (if (>= balance amount) 
     (begin (set! balance (- balance amount)) 
       balance) 
     "Insufficient funds")) 
    (define (deposit amount) 
    (set! balance (+ balance amount)) 
    balance) 
    (define (dispatch m) 
    (cond ((eq? m 'withdraw) withdraw) 
      ((eq? m 'deposit) deposit) 
      (else (error "Unknown request -- MAKE-ACCOUNT" 
         m)))) 
    dispatch) 
+0

Cảm ơn bạn đã liên kết. Tôi biết có một sự tương tự giữa các đối tượng và đóng cửa. Xem chỉnh sửa của tôi cho câu hỏi của tôi, nhưng tôi tự hỏi nếu nó đi sâu hơn so với chỉ một sự tương tự, ít nhất là cho trường hợp của mối quan hệ giữa instantiating một đối tượng bất biến và gọi một chức năng. – jtolle

1

là mô hình đồ chơi của tôi vì vậy đơn giản đi rằng nó vô dụng?

Về cơ bản, có. Mô hình đơn giản của bạn về cơ bản nắm chặt để nói rằng mỗi hoạt động này liên quan đến việc thực hiện tính toán và đưa kết quả vào đâu đó. Nhưng đó là quá chung chung, nó bao gồm bất cứ điều gì mà một máy tính nào. Nếu bạn không thực hiện một tính toán, bạn sẽ không làm bất cứ điều gì hữu ích. Nếu bạn không đặt kết quả ở đâu đó, bạn sẽ làm việc không có gì vì bạn không có cách nào để có được kết quả.Vì vậy, bất cứ điều gì hữu ích bạn làm với một máy tính, từ việc thêm hai sổ đăng ký với nhau, để tìm nạp một trang web, có thể được mô hình hóa như thực hiện một tính toán và đưa kết quả đến một nơi nào đó mà nó có thể được truy cập sau này.

+0

Cả câu trả lời này và z5h đều hữu ích cho tôi, nhưng hãy xem câu hỏi đã chỉnh sửa của tôi và nhận xét tôi để lại trong câu trả lời của z5h. Rõ ràng sự tương tự như bạn đã mô tả nó là vô dụng. Nhưng tôi đã cố gắng để hạn chế nó ... để khởi tạo các đối tượng bất biến và gọi các chức năng. Điều đó làm cho một sự khác biệt? – jtolle

3

Bạn không thể nhận được nhiều tinh khiết hơn tính toán lambda: http://en.wikipedia.org/wiki/Lambda_calculus. Lambda tính toán trong thực tế rất tinh khiết, nó chỉ có chức năng!

Một cách tiêu chuẩn thực hiện một cặp trong phép tính lambda là như vậy:

pair = fn a: fn b: fn x: x a b 
first = fn a: fn b: a 
second = fn a: fn b: b 

Vì vậy pair a b, những gì bạn có thể gọi là một "struct", thực sự là một chức năng (fn x: x a b). Nhưng đó là một loại chức năng đặc biệt được gọi là đóng cửa. Về cơ bản, đóng là một hàm (fn x: x a b) cộng với các giá trị cho tất cả các biến "miễn phí" (trong trường hợp này là ab). Vì vậy, có, instantiating một "struct" giống như gọi một chức năng, nhưng quan trọng hơn, thực tế "struct" chính nó giống như một loại đặc biệt của chức năng (một đóng cửa). Nếu bạn nghĩ về cách bạn sẽ thực hiện một thông dịch viên lambda, bạn có thể thấy sự đối xứng từ phía bên kia: bạn có thể thực hiện một đóng như một biểu thức cộng với một cấu trúc chứa các giá trị của tất cả các biến tự do.

Xin lỗi nếu điều này là tất cả rõ ràng và bạn chỉ muốn một số ví dụ thế giới thực ...

+0

Điều này rất hữu ích. Câu hỏi meta thực sự đối với tôi là học cách nghĩ về các ngôn ngữ khác nhau không phải là các phần tử cú pháp độc lập có thể được kết hợp để làm công cụ, nhưng có liên quan (mặc dù với cú pháp cụ thể) "hàm bao" cho các khái niệm cơ bản hơn. Cảm ơn! – jtolle

+3

@jtolle: Bạn có thể quan tâm đến cuốn sách * Các khái niệm, kỹ thuật và mô hình lập trình máy tính * của Peter van Roy và Seif Haridi. Họ lập luận rằng các ngôn ngữ lập trình có thể bị phân hủy theo * Các mẫu * mà chúng hỗ trợ (ví dụ OOP hoặc Lập trình Logic), và các mô hình đó có thể được phân tích thêm thành * Các khái niệm *. Peter van Roy có áp phích tuyệt vời này với * Phân loại các mô hình lập trình chính *, trong đó liệt kê 34 mô hình, được tạo thành từ khoảng 18 khái niệm. Vì vậy, những "khái niệm cơ bản" bạn đang tìm kiếm ... họ thậm chí * gọi * chúng! –

+0

@Jorg W Mittag, cảm ơn đề xuất đó! Trang sách tại đây: http://www.info.ucl.ac.be/~pvr/book.html, liên kết tới bản nháp có sẵn miễn phí được đăng bởi tác giả ở đây: http://lambda-the-ultimate.org/node/3108 # comment-45392, Áp phích tại đây: http://www.info.ucl.ac.be/~pvr/paradigms.html, tìm kiếm có thể truy cập ("mô hình lập trình cho núm vú giả") tại đây: http://www.info. ucl.ac.be/~pvr/VanRoyChapter.pdf – jtolle

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