2012-01-13 74 views
20

(Tôi chắc chắn điều này phải được trả lời trên trang web này, nhưng tìm kiếm bị ngập với khái niệm gọi miễn phí() trên một biến trong C.)"Biến miễn phí" là gì?

Tôi đã xem cụm từ "giảm eta" đã được xác định một cái gì đó như f x = M x ==> M nếu x là "không miễn phí trong M". Ý tôi là, tôi nghĩ rằng tôi hiểu ý chính của những gì nó đang cố gắng nói, nó có vẻ giống như những gì bạn làm khi bạn chuyển đổi một chức năng thành kiểu không có điểm, nhưng tôi không biết vòng loại về x không phải là phương tiện tự do.

Trả lời

27

Dưới đây là một ví dụ:

\f -> f x 

Trong lambda này, x là một biến miễn phí. Về cơ bản một biến miễn phí là một biến được sử dụng trong một lambda không phải là một trong các đối số lambda (hoặc một biến số let). Nó xuất phát từ bên ngoài bối cảnh của lambda.

giảm Eta nghĩa là chúng ta có thể thay đổi:

(\x -> g x) to (g) 

Nhưng chỉ khi x không phải là miễn phí (tức là nó không được sử dụng hoặc là một cuộc tranh cãi) trong g. Nếu không, chúng tôi sẽ tạo biểu thức đề cập đến biến không xác định:

(\x -> (x+) x) to (x+) ??? 
+2

Nitrat nhỏ: có thể sử dụng 'x' nếu nó bị ràng buộc. Eta-reduce '(\ x -> (\ x -> x + x) x)' thành '(\ x -> x + x)' là hoàn toàn ổn, mặc dù '(\ x -> x + x)' chứa hai lần sử dụng 'x'. Đây là một trường hợp góc mà sẽ không hiển thị nhiều trong việc đối phó với mã con người viết, nhưng tôi tưởng tượng trình biên dịch sẽ chạy trên này thường xuyên hơn. – yatima2975

+0

Tôi đã rối tung lên từ ngữ một chút ở đó. "Nhưng chỉ khi' x' không được sử dụng (tức là không miễn phí) "nên là" Nhưng chỉ khi 'x' không phải là miễn phí (tức là nó không được sử dụng hoặc là một đối số)". Ban đầu tôi đã viết nó theo cách đó nhưng thay đổi nó theo cách khác để làm cho nó đơn giản hơn. Thật không may thay đổi ý nghĩa :) – porges

9

Vâng, here's the relevant Wikipedia article, cho những gì đáng giá.

Phiên bản ngắn là các định nghĩa như vậy sẽ tách rời phần thân của biểu thức lambda bằng cách sử dụng trình giữ chỗ như "M", và do đó phải chỉ rõ thêm rằng biến bị ràng buộc bởi lambda đó không được sử dụng trong bất kỳ trình giữ chỗ nào đại diện.

Vì vậy, "biến tự do" ở đây có nghĩa là một biến được xác định trong một phạm vi ngoài mơ hồ hoặc không xác định - ví dụ: trong một biểu thức như \y -> x + y, x là biến miễn phí nhưng y thì không.

Giảm Eta là loại bỏ một lớp thừa liên kết và áp dụng ngay một biến, tức là (như bạn có thể tưởng tượng) chỉ hợp lệ nếu biến được đề cập chỉ được sử dụng ở một nơi.

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