首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >卤素,副作用(随机数)

卤素,副作用(随机数)
EN

Stack Overflow用户
提问于 2016-09-30 09:51:29
回答 1查看 378关注 0票数 1

在PureScript Halogen项目中,我希望将状态设置为随机数,但是如何提取值?正常人

代码语言:javascript
复制
r <- randomInt 1 10

当它在eval函数中时不编译。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-30 11:59:36

您需要在ComponentDSL中使用适当的monad (当前有e类型var )以使其成为可能,然后可以使用H.fromEff来提升randomInt

代码语言:javascript
复制
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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39788618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档