LINUX.ORG.RU

История изменений

Исправление Softwayer, (текущая версия) :

Можно просто протаскивать старое значение ручками:

myLoop :: Int -> IO ()                                                          
myLoop oldVal = do                                                              
  line <- getLine                                                               
  let newVal = read line :: Int                                                 
  print $ newVal - oldVal                                                       
  myLoop newVal                                                                 
                                                                                
main :: IO ()                                                                   
main = myLoop 0

Можно абстрагировать работу с состоянием через StateT:

myLoop :: StateT Int IO ()                                                      
myLoop = forever $ do                                                                     
  line <- liftIO getLine                                                        
  let newVal = read line :: Int                                                 
  oldVal <- get                                                                 
  liftIO $ print $ newVal - oldVal                                              
  put newVal                                                                                                                                            
                                                                                
main :: IO ()                                                                   
main = evalStateT myLoop 0                                                            

Исходная версия Softwayer, :

Можно просто протаскивать старое значение ручками:

myLoop :: Int -> IO ()                                                          
myLoop oldVal = do                                                              
  line <- getLine                                                               
  let newVal = read line :: Int                                                 
  print $ newVal - oldVal                                                       
  myLoop newVal                                                                 
                                                                                
main :: IO ()                                                                   
main = myLoop 0

Можно абстрагировать работу с состоянием через StateT:

myLoop :: StateT Int IO ()                                                      
myLoop = do                                                                     
  line <- liftIO getLine                                                        
  let newVal = read line :: Int                                                 
  oldVal <- get                                                                 
  liftIO $ print $ newVal - oldVal                                              
  put newVal                                                                    
  myLoop                                                                        
                                                                                
main :: IO ()                                                                   
main = evalStateT myLoop 0