在PureScript Halogen项目中,我希望将状态设置为随机数,但是如何提取值?正常人
r <- randomInt 1 10当它在eval函数中时不编译。
module Main where
import Prelude
import Control.Monad.Eff (Eff)
import Control.Monad.Eff.Random (randomInt, RANDOM)
import Halogen as H
import Halogen.HTML.Events.Indexed as HE
import Halogen.HTML.Indexed as HH
import Halogen.Util (runHalogenAff, awaitBody)
type State = { n::Int }
initialState :: State
initialState = { n: 3}
data Query a = NewRandom a
ui :: forall e. H.Component { n :: Int } Query e
ui =
H.component { render, eval }
where
render :: State -> H.ComponentHTML Query
render state =
HH.button
[ HE.onClick $ HE.input_ NewRandom ]
[ HH.text $ show state.n ]
eval :: Query ~> H.ComponentDSL State Query e
eval (NewRandom next) = do
H.modify (\state -> state { n=12 } )
--I'd like to set n to a random number
--but I don't know how.
--let r = randomInt 1 10
--H.modify (\state -> state { n=r } )
pure next
main :: Eff (H.HalogenEffects ()) Unit
main =
runHalogenAff do
body <- awaitBody
H.runUI ui initialState body发布于 2016-09-30 11:59:36
您需要在ComponentDSL中使用适当的monad (当前有e类型var )以使其成为可能,然后可以使用H.fromEff来提升randomInt
module Main where
import Prelude
import Control.Monad.Aff (Aff)
import Control.Monad.Eff (Eff)
import Control.Monad.Eff.Random (randomInt, RANDOM)
import Halogen as H
import Halogen.HTML.Events.Indexed as HE
import Halogen.HTML.Indexed as HH
import Halogen.Util (runHalogenAff, awaitBody)
type State = { n::Int }
initialState :: State
initialState = { n: 3}
data Query a = NewRandom a
ui :: forall eff. H.Component { n :: Int } Query (Aff (random :: RANDOM | eff))
ui =
H.component { render, eval }
where
render :: State -> H.ComponentHTML Query
render state =
HH.button
[ HE.onClick $ HE.input_ NewRandom ]
[ HH.text $ show state.n ]
eval :: Query ~> H.ComponentDSL State Query (Aff (random :: RANDOM | eff))
eval (NewRandom next) = do
r <- H.fromEff $ randomInt 1 10
H.modify (\state -> state { n=r } )
pure next
main :: forall eff. Eff (H.HalogenEffects (random :: RANDOM | eff)) Unit
main =
runHalogenAff do
body <- awaitBody
H.runUI ui initialState body(旁白:如果你正在做一些有效的事情,即使你只需要Eff,使用Aff作为ComponentDSL monad也是最容易的,就像当你使用runUI时,它希望它是Aff --可以在Halogen.Component模块中使用interpret来更改monad,但是既然您只是在那里使用interpret liftAff,那么您最好直接去Aff)。)
有关在指南中的“非国家效应”一节中运行效果的更多细节,请查看AJAX示例或eval。
https://stackoverflow.com/questions/39788618
复制相似问题