避免可变状态更新String

时间:2016-09-28 21:00:01

标签: haskell

我正在尝试编写一个函数,如果一个随机生成的int小于5,将继续循环检查,如果它小于5,那么“e”会附加到一个字符串,一旦生成“eee”然后退出走出循环。

如果1到10之间的随机值小于5:

,则打印此Haskell代码
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的指针?

1 个答案:

答案 0 :(得分: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'个字符。

相关问题