Hi everyone!<br><br>(First of all, I don&#39;t know Monads!)<br><br>I made a GCL (Guarded Command Language) Compiler and Interpreter for my Languages and Machines course in my University with alex, happy and ghc. I asked about a week ago about the use of unsafePerformIO for that same project, now I have two new doubts:<br>

<br>1) When more than a Condition is true in a<br>    if cond1 -&gt; instruction1<br>    |  cond2 -&gt; instruction2<br>    ...<br>    | condN -&gt; instructionN<br>    fi<br>  I need to randomly select ONE of the valid conditions and execute it&#39;s instruction. I know there is a Random Monad, but it returns an IO Int, Is there anyway I can do some Random that doesn&#39;t involve IO? or any other solution? That part of the code is:<br>

<br>(My code is in Spanish. TablaOutput is a type and it stands for the tupe of the Symbol Table (Data.Map) and the Output [String], obtenerValidos checks wich pair of (condition,instruction) are true and makes a list out of them, ejecutarUnoRand is the Instruction that executes one of the instructions randomly)<br>

<br>evalSeleccion:: [(BoolY,Instruccion)] -&gt; TablaOutput -&gt; TablaOutput<br>evalSeleccion lista tabla =<br>    let validos = obtenerValidos lista [] tabla<br>    in if (isEmpty validos) then error &quot;Las guardias del If estan incompletas&quot;<br>

        else ejecutarUnoRand validos tabla<br><br>obtenerValidos:: [(BoolY,Instruccion)] -&gt; [(BoolY,Instruccion)] -&gt; TablaOutput -&gt; [(BoolY,Instruccion)]<br>obtenerValidos [] validos tabla = validos<br>obtenerValidos ((boolY,instruccion):bloqueIns) validos tabla = if (evalBoolY boolY (fst tabla)) then obtenerValidos bloqueIns (validos ++ [(boolY,instruccion)]) tabla<br>

                                                                              else obtenerValidos bloqueIns validos tabla<br><br>ejecutarUnoRand:: [(BoolY,Instruccion)] -&gt; TablaOutput -&gt; TablaOutput<br>ejecutarUnoRand validos tabla =<br>

    let rand = 0 --getStdRandom (randomR (0,(length validos))) HERE&#39;S WHERE I&#39;M SUPPOSED TO DO RANDOM, RIGHT NOW I&#39;M JUST CHOSING THE FIRST<br>    in evalInstruccion (snd (validos !! rand)) tabla<br><br>2) Since Haskell is Lazy, and my GCL program is being interpreted in Haskell then my GCL is Lazy too (I know is not as simple as that but believe me, somehow it is behaving lazy). The problem is that it can&#39;t be lazy (said to me by my teacher today) so I tried using seq, I&#39;ll paste the code after this:<br>

Programs in GCL like:<br>a)<br>var i : value<br>main<br>    i &lt;- 1 / 0<br>end<br><br>b)<br>
var i : value<br>
main<br>
    i &lt;- 1 / 0;<br>    show i<br>
end<br><br>c)<br>
var i : value<br>var foo : array of 2<br>
main<br>
    i &lt;- foo[42]<br>
end<br><br>d)<br>
var i : value<br>
main<br>
    i &lt;- foo[42];<br>    show i<br>
end<br><br>acts like this:<br>a and c finish interpretation<br>b throws division by zero error and finish interpretation<br>d throws index out of bounds error and finish interpretation<br><br>Now the code:<br>(again, it is in Spanish. ListLValue is a List of L-Values for the assigments, ListExpr is the list of Expressions to be assigned, Tabla is the Symbol Table (Data.Map), actualizarVar updates a Variable in the Symbol Table with the new value &quot;valor&quot;, ActualizarArray updates the position &quot;indice&quot; of an array in the Symbol Table. evalExpr evaluates an arithmetic Expression and returns an Int. Inside evalExpr are the verifications for division by zero of modulo by zero.)<br>

<br>evalAsignacion:: ListLvalue -&gt; ListExpr -&gt; Tabla -&gt; Tabla<br>evalAsignacion [] [] tabla = tabla<br>evalAsignacion ((Lid id):valueList) (expr:exprList) tabla =<br>    let valor = (evalExpr expr tabla)<br>    in valor `seq` evalAsignacion valueList exprList (actualizarVar id valor tabla)<br>

evalAsignacion ((LArrayPosition id exprArray):valueList) (expr:exprList) tabla =<br>    let valor = (evalExpr expr tabla)<br>        indice = (evalExpr exprArray tabla)<br>    in valor `seq` indice `seq` evalAsignacion valueList exprList (actualizarArray id indice valor tabla)<br>

<br>evalExpr:: Expr -&gt; Tabla -&gt; Int<br>evalExpr expr tabla =<br>    let salida = (snd (evalAritmetico expr tabla))<br>    in salida `seq` if (isLeft salida) then error (getLeft salida)<br>                              else getRight salida<br>

<br>--((Int,Int) is the Line and Colum, that&#39;s for error reporting)<br>evalAritmetico :: Expr -&gt; Tabla -&gt; ((Int,Int),(Either String Int))<br>--LET ME KNOW IF YOU NEED THIS PART TOO<br><br><br>Thanks in advance,<br>

<br>Hector Guilarte<br>