2013-08-30 16 views
5

Aby wypróbować Netwire, wdrażam Ponga przy użyciu biblioteki. W kodzie mam drut kulkowy i komputerowy drut wiosło, a ponieważ zależą od siebie nawzajem dla niektórych wartości, mam problemy z nieskończonymi pętlami. Niektóre pseudokoduły do ​​wyjaśnienia:Druty wzajemnie zależne od Netwire

ball :: Wire() IO GameInput Ball 
ball = (... define ball ...) . pcPaddle 

pcPaddle :: Wire() IO GameInput Paddle 
pcPaddle = (... define pcPaddle ...) . ball 

Należy zwrócić uwagę, że wzajemnie się przyjmują. Próbowałem złagodzić to w następujący sposób:

ball :: Wire() IO GameInput Ball 
ball = (...) . delay (... base paddle init ...) . pcPaddle 

i inne odmiany za pomocą funkcji w tych dwóch przewodów delay, ale dostaję błąd <<loop>> wykonania niezależnie.

Jak zainicjować jeden z przewodów, aby ten system mógł działać?

Odpowiedz

6

Oczywiście 5 minut później znajduję magiczną kombinację, która wydaje się działać. Co zrobiłem ja zmieniony wejść przewody miały by być

ball :: Wire() IO Paddle Ball 
ball = ... 

paddle :: Wire() IO Ball Paddle 
paddle = ... 

wtedy, gdy przyszło do tworzenia moją sieć przewodów Zrobiłem to:

{-# LANGUAGE DoRec #-} 
{-# LANGUAGE Arrows #-} 
system = proc g -> do 
    rec b <- delay (... ball initial value ...) . ball -< p 
     p <- paddle -< b 

    returnA -< (b,p) 

Ten acknowlegdes ich zależność i daje wprowadzić wartość początkową atrapa dla piłki na pierwszym rzucie.

Powiązane problemy