2016-09-28 2 views
0

무작위로 생성 된 int가 5보다 작은 경우 계속 루프를 검사하는 함수를 작성하려고합니다. 5보다 작 으면 "e"가 문자열에 추가되고, eee "가 생성 된 다음 루프 밖으로 나간다.문자열을 업데이트하기 위해 가변 상태 피하기

이 하스켈 코드 인쇄 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 

하지만 가변 상태를 도입하지 않고 문자열을 수정하는 방법을 확실 해요.

이 사용하는 의사 하스켈 코드를 사용할 수 있습니다 달성하기

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' 문자를 앞에 붙입니다.

관련 문제