ten C koncepcyjnie można opisać jako tworzenie nowej tablicy identyczną tablicy wejść, z 1 jako pierwszy element:Haskell: stosować ostatni odnosi się do zmiennej efektywnego tworzenia nowego kodu o zmiennej
int* retire_and_update(int* arr) {
arr[0] = 1;
return arr;
}
tę jest czystą funkcją (mrugnięcie wink nucić) tak długo, jak nie ma dalszych odniesień do tablicy wejściowej i jej elementów. System typu C nie wymusi tego dla nas, ale z zasady wydaje się być wykonalny.
Kod, który generuje gcc jest prosty i skuteczny:
retire_and_update:
movq %rdi, %rax
movl $1, (%rdi)
ret
Nasza funkcja osiąga pozornie niemożliwe, tworząc zupełnie nową tablicę w stałym czasie i przy użyciu dodatkowej pamięci. Miły. Czy można napisać funkcję Haskella z tablicowymi danymi wejściowymi i wyjściowymi, które mogą być poprawnie implementowane za pomocą podobnego kodu? Czy istnieje sposób na wyrażenie "to jest ostatnie odniesienie do tej zmiennej", aby czysta funkcja mogła kanibalizować zmienną za kulisami?
Jeśli funkcja zostanie wstawiona, wtedy nic ciekawego się nie stanie, więc załóżmy, że wywołujący i funkcja będą kompilowane osobno.
IIUC „wyjątkowość typy”, lub podobnie typy liniowe, to zrobić. Niestety nie są one cechą systemu typu Haskell. Konwencjonalny sposób w Haskell polega na używaniu monady ST's (https://hackage.haskell.org/package/base-4.8.1.0/docs/Control-Monad-ST.html) w celu osiągnięcia mutacji w koncepcji. czyste ustawienie (które tymczasowo wchodzi w monadę o zmiennym stanie, ale system typu gwarantuje, że obliczenia są deterministyczne, a stan nie wycieka). To coś zupełnie innego niż to, o czym mówisz. – luqui
[Clean] (http://clean.cs.ru.nl/Clean) to język funkcjonalny wykorzystujący typy niepowtarzalności, na które wpływ ma również Haskell. – chi