我正在尝试编写一个函数,如果一个随机生成的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的指针?
答案 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'
个字符。