2016-09-28 1 views
0

Я пытаюсь написать функцию, которая будет постоянно проверять цикл, если случайно генерируемое значение int меньше 5, если оно меньше 5, тогда «e» добавляется к строке, eee "генерируется, а затем выходит из цикла.Избегание изменяемого состояния для обновления String

код печатает Это 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'.