2016-09-30 2 views
1

In einem PureScript Halogen-Projekt möchte ich den Zustand auf eine zufällige Zahl setzen, aber wie extrahiere ich den Wert? Das normalePurescript Halogen, Nebeneffekt (Zufallszahl)

r <- randomInt 1 10 

kompiliert nicht, wenn es in der Eval-Funktion ist.

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 

Antwort

3

Sie benötigen einen geeigneten Monade verwenden, um mit Ihrem ComponentDSL (wo Sie die e Typ var zur Zeit) ist es möglich zu machen, und dann können Sie H.fromEff verwenden, um die randomInt zu heben:

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 

(Abgesehen davon: Wenn Sie effektvolle Dinge tun, auch wenn Sie nur Eff benötigen, ist es am einfachsten Aff als ComponentDSL Monade zu verwenden, wenn Sie runUI verwenden, erwartet es Aff - es ist möglich, cha nge der Monade, mit interpret im Halogen.Component Modul, aber da Sie würde nur interpret liftAff es trotzdem verwenden, man kann auch direkt auf Aff gehen.)

Werfen Sie einen Blick auf die "Non-state effects" section of the guide oder AJAX example für weitere Details auf Laufeffekte in eval.