7

Uczę się Haskella i Yampy w tej chwili i mam pytanie dotyczące funkcji reakcji.Różnica czasu w funkcji reakcji (zmysłów) w Yampie

reactimate :: IO a -- init 
     -> (Bool -> IO (DTime, Maybe a)) -- sense 
     -> (Bool -> b -> IO Bool) -- actuate 
      -> SF a b -- signal function 
     -> IO() 

Jak widać w podpisie typu, część wyjście dla funkcji zmysłów jest różnica czasu między obecnym a poprzednim wywołaniu funkcji. W przykładach, które widziałem, ta różnica czasu jest "ręcznie" obliczana wewnątrz sensu, przy użyciu IORef, aby zachować wartość poprzedniego połączenia.

Wydaje się dziwne, że musisz śledzić różnicę czasu, używając stanu zewnętrznego, dlaczego te obliczenia nie są wykonywane w funkcji reakcji? Czy IORef to dobry sposób na radzenie sobie z tym?

Odpowiedz

1

Sądzę, że powodem, dla którego reaktywacja nie oblicza delty czasowej, jest to, że oznaczałoby to jednoznaczne pojęcie czasu. Wyobraź sobie, że chcesz symulować ryzyko portfela przez okres dziesięciu lat lub coś podobnego, a rozdzielczość delty czasu powinna wynosić jeden dzień. Mówiąc to, zgadzam się, że rzecz Iorefa wygląda na zjadliwego, chociaż użyłem tej samej techniki w moim kodzie.

Powiązane problemy