C này mới khái niệm có thể được mô tả như tạo ra một mảng mới giống với một mảng đầu vào nhưng với 1 là yếu tố đầu tiên:Haskell: sử dụng tài liệu tham khảo cuối cùng cho một biến để tạo ra hiệu quả một biến đang
int* retire_and_update(int* arr) {
arr[0] = 1;
return arr;
}
này là một hàm thuần túy (wink wink nudge nudge) miễn là không có tham chiếu thêm nào được thực hiện cho mảng đầu vào và các phần tử của nó. Hệ thống kiểu C sẽ không thực thi điều đó đối với chúng ta nhưng nó có vẻ thực thi theo nguyên tắc.
Mã gcc mà tạo ra rất đơn giản và hiệu quả:
retire_and_update:
movq %rdi, %rax
movl $1, (%rdi)
ret
chức năng của chúng tôi đạt được dường như bất khả thi bằng cách tạo ra một mảng hoàn toàn mới trong thời gian liên tục và không sử dụng bộ nhớ bổ sung. Tốt đẹp. Có thể hàm Haskell với đầu vào và đầu ra giống như mảng được viết có thể được triển khai hợp lệ với mã tương tự không? Có cách nào để diễn tả "đây là tham chiếu cuối cùng cho biến này" sao cho một hàm thuần túy có thể ăn mòn biến đằng sau hậu trường?
Nếu hàm được gạch chân thì không có gì thú vị cần xảy ra ở đây, vì vậy, giả sử người gọi và chức năng sẽ được biên dịch riêng.
IIUC "loại độc đáo", hoặc tương tự như loại tuyến tính, làm được điều này. Thật không may, đây không phải là một tính năng của hệ thống kiểu Haskell. Cách thông thường trong Haskell là sử dụng [đơn vị 'ST'] (https://hackage.haskell.org/package/base-4.8.1.0/docs/Control-Monad-ST.html) để đạt được đột biến trong một khái niệm thiết lập thuần túy (tạm thời nhập vào một đơn nguyên có trạng thái có thể thay đổi, nhưng hệ thống kiểu đảm bảo rằng tính toán là xác định và trạng thái không bị rò rỉ). Đó là một điều rất khác so với những gì bạn đang nói về mặc dù. – luqui
[Sạch] (http://clean.cs.ru.nl/Clean) là một ngôn ngữ chức năng sử dụng các loại duy nhất, cũng bị ảnh hưởng bởi Haskell. – chi