Не могу выйти из рекурсии в рефлекс-домене

Код компилируется, но при запуске застревает в бесконечном рекурсивном цикле. Непонятно, куда входит цикл, особенно при использовании рекурсивного do или monadfix. При попытке отладки в браузере он находит циклическую оценку в fixIO в строке 6086 rts.js.

{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE RecursiveDo         #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE MonoLocalBinds      #-}

import Reflex.Dom
import qualified Data.Text as T

main :: IO ()
main = mainWidget game

game :: MonadWidget t m => m ()
game = elClass "div" "game" $ do
  elClass "div" "game-board" $ do
    rec
      stateEv <- board stateEv [["","",""],["","",""],["","",""]]
    elClass "div" "game-info" $ do
      elClass "div" "statu" $ blank
      elClass "ol" "todo" $ blank

board :: MonadWidget t m
      => [[Event t T.Text]]
      -> [[T.Text]]
      -> m [[(Event t T.Text)]]
board s iss = elClass "div" "board" $ do
  el "div" $ do
    elClass "div" "status" $ text "Next player: X"
    mapM (boardRow s) iss

boardRow :: MonadWidget t m
         => [[Event t T.Text]]
         -> [T.Text]
         -> m [(Event t T.Text)]
boardRow s is = elClass "div" "board-row" $ mapM (square s) is

square :: (
            PostBuild t m
          , DomBuilder t m
          , MonadHold t m
          )
       => [[Event t T.Text]]
       -> T.Text
       -> m (Event t T.Text)
square stateEv i = do
  rec
    let ev = domEvent Click e
        ev' = updated dyn
        ev'' = tagPromptlyDyn dyn ev
        dyn = tooglePlayer <$> dynBool

    dyns <- mapM (holdDyn i) (concat stateEv)
    dynBool <- toggle True $ updated $ distributeListOverDyn dyns

    (e, _) <- elAttr' "button" ("type" =: "button" <> "class" =: "square") $ dynText dyn
  return ev''

tooglePlayer :: Bool -> T.Text
tooglePlayer True  = "X"
tooglePlayer False = "O"

0 ответов

Другие вопросы по тегам