2016-09-28 46 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 

任何指針來翻譯上面的僞代碼,以有效的Haskell?

回答

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'字符。