【问题标题】:Purescript Halogen, side effect (random number)Purescript 卤素,副作用(随机数)
【发布时间】:2016-09-30 09:51:29
【问题描述】:

在 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

【问题讨论】:

    标签: random state purescript halogen


    【解决方案1】:

    您需要使用适当的 monad 和您的 ComponentDSL(您目前有 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 时它期望它是@ 987654332@ - 可以在 Halogen.Component 模块中使用 interpret 更改 monad,但既然你只是在那里使用 interpret liftAff,你不妨直接去 Aff。)

    查看"Non-state effects" section of the guideAJAX example,了解eval 中运行效果的更多详细信息。

    【讨论】:

      猜你喜欢
      • 2017-05-28
      • 2018-09-11
      • 2018-04-29
      • 1970-01-01
      • 2016-12-02
      • 2020-12-31
      • 2011-05-22
      • 2010-12-18
      • 1970-01-01
      相关资源
      最近更新 更多