pure
đã được mở rộng một chút kể từ khi phát hành TDPL, kể từ pure
như TDPL mô tả hóa ra là quá hạn chế để hữu ích ngoài chức năng toán học đơn giản và tương tự. Bạn có thể nhìn vào the online documentation cho định nghĩa hiện nay, nhưng về cơ bản đi xuống đến này:
pure
chức năng không thể truy cập bất kỳ mô-đun cấp hoặc các biến tĩnh có thể được biến đổi trong quá trình của chương trình (họ phải Các loại giá trị const
hoặc immutable
để truy cập từ chức năng pure
).
pure
chức năng không thể gọi bất kỳ chức năng nào không phải là pure
.
pure
chức năng không thể thực hiện I/O.
Vậy đó. Không có hạn chế nào khác. Tuy nhiên, có là các hạn chế bổ sung cần thiết nếu chức năng pure
sẽ được tối ưu hóa sao cho nó chỉ được gọi một lần ngay cả khi được sử dụng nhiều lần trong một tuyên bố. Cụ thể:
- Tham số của hàm phải là
immutable
hoặc chuyển đổi hoàn toàn thành immutable
.
Về lý thuyết có thể được mở rộng để đòi hỏi rằng của chức năng luận phải immutable
hoặc ngầm mui trần để immutable
(vì vậy mà một hàm với const
thông số có thể được tối ưu hóa khi nó được immutable
arguments), nhưng đó không phải là hiện trường hợp.
Các chức năng như vậy pure
đôi khi được gọi là "mạnh" pure
, trong khi các chức năng không thể được tối ưu hóa sẽ được gọi là "yếu" pure
. TDPL mô tả các chức năng mạnh mẽ pure
. Các hàm pure
yếu được thêm vào để làm cho pure
thường sử dụng được hơn.
Trong khi yếu pure
chức năng thể thay đổi lập luận của họ, họ không thể thay đổi trạng thái toàn cầu, vì vậy khi chúng được gọi bằng cách mạnh mẽ pure
chức năng (mà không có thể thay đổi lập luận của họ), đảm bảo rằng các mạnh pure
giá trị trả về của hàm sẽ luôn giống nhau cho cùng một đối số vẫn giữ. Về cơ bản, bởi vì các hàm pure
yếu kém không thể biến đổi trạng thái toàn cục, chúng là một phần của trạng thái riêng tư của hàm pure
mạnh mẽ mà chúng được gọi. Vì vậy, nó rất phù hợp với những gì Andrei mô tả trong phần 5.11.1.1 pure
là pure
Có trong TDPL, ngoại trừ trạng thái riêng của hàm đã được mở rộng để cho phép các chức năng có thể thay đổi trạng thái riêng của nó mà không thay đổi trạng thái toàn cầu .
Một điều quan trọng khác của lưu ý đã được thêm từ TDPL liên quan đến pure
là suy luận thuộc tính hàm. pure
, nothrow
và @safe
được suy ra cho các chức năng được tạo khuôn mẫu (mặc dù không phải là cho các chức năng bình thường). Vì vậy, nếu chức năng được tạo mẫu có thể là pure
, bây giờ là làpure
. Độ tinh khiết của nó phụ thuộc vào những gì nó được khởi tạo. Vì vậy, nó trở thành có thể sử dụng pure
với chức năng templated, trong khi trước đây, bạn thường không thể, bởi vì nếu bạn thực hiện nó pure
, nó sẽ không hoạt động với một hàm không tinh khiết. Nhưng nếu bạn không làm cho nó pure
, thì bạn không thể sử dụng nó với chức năng pure
, do đó, đây là vấn đề chính đối với pure
. May mắn thay, sửa lỗi suy luận thuộc tính mà bây giờ mặc dù. Miễn là một chức năng theo khuôn mẫu tuân theo các quy tắc được liệt kê ở trên khi nó được khởi tạo, thì nó được coi là pure
.
Tôi đã cố gắng xóa thẻ [tag: pure], vì đôi khi nó đề cập đến các hàm ảo thuần túy, đôi khi thành [pure] (http://beebole.com/pure/) và đôi khi thành [pure ] (http://en.wikipedia.org/wiki/Pure_ (programming_language)) - trong số những người khác. Nhưng tôi không biết gì về [tag: d]. Bạn có thể xác nhận xem chỉnh sửa thẻ của tôi có phù hợp không? [Tag: hoàn toàn chức năng] có hoạt động cho câu hỏi này không - tôi đã tạo [tag: pure-function], vì vậy nếu [tag: purely-functional] hoạt động, tôi nghĩ sẽ tốt hơn nếu sử dụng thẻ hiện tại. –
@RichardJPLeGuen Tinh khiết như trong [độ tinh khiết chức năng] (http://en.wikipedia.org/wiki/Pure_function), vì vậy chức năng thuần túy sẽ hoạt động cho câu hỏi này. hoàn toàn chức năng, không quá nhiều. – Arlen
Cảm ơn, @Arlen! –