Pracuję nad napisaniem sobie schematu w 48 godzin (mam do około 85 godzin) i dotarłem do części dotyczącej dodawania zmiennych i przypisań . W tym rozdziale jest duży skok koncepcyjny i żałuję, że nie wykonano go w dwóch krokach z dobrą refaktoryzacją pomiędzy, a nie przeskakiwaniem od razu do ostatecznego rozwiązania. Tak czy inaczej…
Stałam utracone z wielu różnych klas, które wydają się służyć temu samemu celowi: State
, ST
, IORef
, i MVar
. Pierwsze trzy są wymienione w tekście, a ostatnia wydaje się być preferowaną odpowiedzią na wiele pytań StackOverflow dotyczących pierwszych trzech. Wszystkie wydają się nosić stan między kolejnymi inwokacjami.
Co to jest i czym się od siebie różnią?
W szczególności te zdania nie mają sensu:
Zamiast tego używamy funkcji zwanej wątkami stanu , pozwalając Haskellowi zarządzać za nas stanem zagregowanym. To pozwala nam traktować zmienne zmienne tak jak w każdym innym języku programowania, używając funkcji do pobierania lub ustawiania zmiennych.
i
Moduł IORef pozwala na używanie zmiennych stanowych w monadzie IO .
Wszystko to sprawia, że linia jest type ENV = IORef [(String, IORef LispVal)]
zagmatwana - dlaczego druga IORef
? Co się zepsuje, jeśli type ENV = State [(String, LispVal)]
zamiast tego napiszę ?