1

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
4

1 に答える 1

3

それを可能にするために、(現在 var 型ComponentDSLを持っている) で適切なモナドを使用する必要があります。eH.fromEffrandomInt

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使用するのが最も簡単です。使用するときに期待されるように、モジュールで使用してモナドを変更することは可能ですが、とにかくそこで使用するだけで、直接 に行くこともできます。)AffComponentDSLrunUIAffinterpretHalogen.Componentinterpret liftAffAff

で効果を実行する方法の詳細については、ガイドの「非状態効果」セクション、またはAJAX の例evalを参照してください。

于 2016-09-30T11:59:36.780 に答える