Сигнал Purescript многократно запускается в начале времени

Я создаю игру в Purescript, используя сигнал purescript, который включает в себя движение. Пользователь нажимает левую/правую клавишу для перемещения влево/вправо. Минимальный код ниже.

Похоже, что purescript оценивает сигнал «с начала времен» на каждом шагу, что меня сбивает с толку. Например, если я продолжаю нажимать правую клавишу в начале, вывод будет

m: 0
m: 0
m: 1
m: 0
m: 1
m: 2
m: 0
m: 1
m: 2
m: 3

скорее, чем

m: 0
m: 1
m: 2
m: 3

как я и ожидал. Как это исправить?

module SimpleMove where

import Prelude
import Control.Monad.Eff (Eff)
import Control.Monad.Eff.Console (CONSOLE, log)
import Data.Functor
import Data.Int
import Signal (Signal, runSignal, foldp, sampleOn, map2)
import Signal.DOM (keyPressed)
import Signal.Time (Time, second, every)
import Partial.Unsafe (unsafePartial)

--MODEL
type Model = Int

step :: forall e. Partial => Int -> Eff (console :: CONSOLE | e) Model -> Eff (console :: CONSOLE| e) Model
step dir m' = 
  do
    m <- m'
    log ("m: " <> (show m))
    pure (m + dir)

--SIGNALS
inputDir :: Eff _ (Signal Int)
inputDir = 
    let 
        f = \l r -> if l 
                    then -1 
                    else if r
                         then 1
                         else 0
    in
      map2 f <$> (keyPressed 37) <*> (keyPressed 39)

input :: Eff _ (Signal Int)
input = sampleOn (every second) <$> inputDir

--MAIN
main :: Eff _ Unit
main =
    unsafePartial do
      dirSignal <- input
      let game = foldp step (pure 0) dirSignal
      runSignal (map void game)

person holdenlee    schedule 30.10.2016    source источник


Ответы (1)


Если вы измените свои main и step таким образом, вы получите ожидаемый результат:

main :: Eff _ Unit
main = do
      dirSignal <- input
      let game = foldp step 0 dirSignal
      runSignal (map render game)

step :: forall e. Int -> Model -> Model
step dir m = m + dir

render :: forall e. Model -> Eff (console :: CONSOLE| e) Unit
render m = logShow m
person soupi    schedule 10.11.2016