W wywiadzie dla Johna Hughesa, w którym mówi o Erlangu i Haskellu, ma następujące zdanie na temat korzystania z bibliotek stanowych w Erlangu:
Jeśli chcę korzystać z biblioteki stanowej, zwykle buduję na niej interfejs bez efektów ubocznych, aby móc bezpiecznie używać go w pozostałej części kodu.
Co on przez to rozumie? Próbuję wymyślić przykład, jak by to wyglądało, ale zawodzi mnie wyobraźnia i / lub wiedza.
haskell
erlang
state
side-effect
beta
źródło
źródło
Odpowiedzi:
(Nie znam Erlanga i nie mogę napisać do Haskella, ale myślę, że mimo to mogę odpowiedzieć)
W tym wywiadzie podany jest przykład biblioteki generowania liczb losowych. Oto możliwy stanowy interfejs:
Dane wyjściowe mogą być
5 2 7
. Dla kogoś, kto lubi niezmienność, jest to po prostu zły! Powinno tak być5 5 5
, ponieważ wywołaliśmy metodę na tym samym obiekcie.Czym byłby interfejs bezstanowy? Możemy zobaczyć sekwencję liczb losowych jako leniwie ocenianą listę, z której
next
faktycznie pobiera się głowa:Dzięki takiemu interfejsowi zawsze możemy przywrócić poprzedni stan. Jeśli dwa fragmenty twojego kodu odnoszą się do tego samego RNG, faktycznie otrzymają tę samą sekwencję liczb. W funkcjonalnym sposobie myślenia jest to bardzo pożądane.
Wdrożenie tego w stanowym języku nie jest takie skomplikowane. Na przykład:
Po dodaniu odrobiny cukru syntaktycznego, aby wyglądał jak lista, jest to całkiem niezłe.
źródło
Kluczową koncepcją jest tutaj zewnętrzny stan zmienny . Biblioteka, która nie ma zewnętrznego stanu zmiennego, jest wolna od skutków ubocznych. Każda funkcja w takiej bibliotece zależy tylko od przekazanych do niej argumentów.
Przydatne testy lakmusowe, których używam:
źródło