2013-10-13 13 views
5

Czy jest możliwe, aby czyste funkcje w Haskell zmutowały lokalne kopie zmiennych, w sposób, w jaki clojure może, jak wspomniano w Functional Programming Is A Scam! by David Nolen? Jeśli nie, jakie są tego powody, a jeśli tak, to czy są jakieś przykłady, które ktoś mógłby wskazać mi?Czy dla czystych funkcji w Haskell można mutować lokalne kopie zmiennych?

Podobnym pytaniem zadano w Functions that look pure to callers but internally use mutation, a ogólna zgoda wydawała się być zgodna z czystymi funkcjami w celu przeprowadzenia mutacji, o ile mutacje były wykonywane na lokalnych kopiach zmiennych (tj. Efekt mutacji nie uciec z funkcji i mieć efekty nielokalne).

Powstało pytanie, kiedy przetłumaczył rodzaju bąbla w Shen (Local mutation, global mutation, mutable datastructures, Bubblesort in Qi), który robi nie mutować listę, aby Common Lisp i w porównaniu do sortowanie bąbelkowe w Bubblesort in Common Lisp, który ma mutować listę. W rezultacie odkryłem, że (w Common Lisp) wersja, która zmutowała listę, była znacznie szybsza, w przypadku bardzo dużych list, niż wersja, która nie zmutowała listy.

Odpowiedz

11

Monadę ST służy do bezpiecznego osadzania zmiennych operacji w czystym kodzie. System typów jest wykorzystywany do zapewnienia, że ​​żadne ze zmutowanych danych nie może uciec przed zasięgiem, dzięki czemu uzyskuje się moc lokalnego stanu zmiennego bez niebezpieczeństwa, że ​​cały program stanie się ważny (co może zniszczyć przejrzystość referencyjną lub wprowadzić warunki wyścigu).

Niektóre dokumentację monady ST:

+0

Dzięki. Przykład sumST w "Wiki Haskella" jasno pokazuje, w jaki sposób czysta funkcja może wykorzystywać lokalne mutacje. – artella

Powiązane problemy