2016-09-28 5 views
0

ランダムに生成されたintが5未満であるかどうかを連続的にチェックする関数を記述しようとしています.5未満の場合は文字列に "e" eee "が生成され、ループから抜ける。文字列を更新するために可変状態を避ける

このHaskellコードが印刷さ1の間のランダムな値ならば - 10は、5未満である:

useInt :: Int -> Int 
useInt x = x 

test :: IO() 
test = do 
    let l = "eee"; 
    int <- randomRIO (1, 10) :: IO Int 
    if(int < 5) then   
     putStrLn "less" 
    else 
     putStrLn "greater" 

test 

しかし、私は可変状態を導入せずに文字列を変更する方法がわかりませんよ。この使用した擬似Haskellコードを達成するために

を使用することができます。

var mutableString = "" : 

useInt :: Int -> Int 
useInt x = x 

test :: IO() 
test = do 
    let l = "eee"; 
    int <- randomRIO (1, 10) :: IO Int 
    while(mutableString != "eee"){ 
    if(mutableString == "eee") 
     break out of loop 
    else 
     if(int < 5) then 
      mutableString = mutableString + "e" 
      putStrLn "less" 
     else 
      putStrLn "greater" 
    } 
test 

を任意のポインタの有効なハスケルに擬似コードの上に変換するために?

答えて

5

使用再帰:

test :: IO() 
test = let 
    loop "eee" = putStrLn "ending" -- end of the "loop" 
    loop l = do      -- "loop" iteration 
     int <- randomRIO (1, 10) :: IO Int 
     if int < 5 
     then do 
     putStrLn "less" 
     loop l    -- same value for l 
     else do 
     putStrLn "greater" 
     loop ('e':l)   -- updated value for l 
    in loop ""     -- "loop" start with initial value for l 

アイデアはloop lをパラメータとしてl「可変」の現在の値をとるということです。再帰するときには、新しい値lを渡します。上記のthenブランチでは、変更したくないので同じ値を渡します。 elseブランチには、'e'文字が先頭に追加されています。

関連する問題