为什么这个变量超出了范围? (Haskell的)

时间:2017-11-13 07:44:17

标签: haskell syntax scope mutable

我会正确的(我删除了一堆无关的代码,如果这看起来有点搞笑 - 试图让它成为MCVE):

import System.IO
import Control.Monad
import Data.IORef

main :: IO ()
main = do
    hSetBuffering stdout NoBuffering 

    input_line <- getLine
    let input = words input_line
    let x0 = read (input!!0) :: Int
    x <- newIORef x0
    loop

loop :: IO ()
loop = do
    input_line <- getLine
    let the_dir = input_line :: String 

    putStrLn x

    loop

为了测试它,我尝试输出x并且它说它超出了范围。为什么?我如何修复它以便它在范围内?我需要访问变量,但我还需要在第一次进入循环之前初始化它们。

1 个答案:

答案 0 :(得分:1)

您可以将x作为参数。

import System.IO
import Control.Monad
import Data.IORef

main :: IO ()
main = do
    hSetBuffering stdout NoBuffering 

    input_line <- getLine
    let input = words input_line
    let x0 = read (input!!0) :: Int
    x <- newIORef x0
    loop x

loop :: Int -> IO ()
loop x = do
    input_line <- getLine
    let the_dir = input_line :: String 

    putStrLn $ show x

    loop

或者只使用forever

import Control.Monad

...

    x <- newIORef x0
    forever $ do
        input_line <- getLine
        let the_dir = input_line :: String 

        putStrLn $ show x