为什么这个变量不在范围之内?(哈斯克尔)

Why is this variable out of scope? (Haskell)

提问人:user8930358 提问时间:11/13/2017 最后编辑:ice1000user8930358 更新时间:11/13/2017 访问量:775

问:

我会直接开始(我删除了一堆无关的代码,以防这看起来有点有趣 - 试图让它成为 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,它说它超出了范围。为什么?如何修复它使其在范围内?我需要访问变量,但我还需要在我第一次进入循环之前初始化它们。

哈斯克尔 语法 范围 可变

评论

0赞 shree.pat18 11/13/2017
你能接受一个输入参数并传递给它吗?loopx
0赞 user8930358 11/13/2017
我不知道怎么做,但我认为这是一种有效的方法
4赞 shree.pat18 11/13/2017
更重要的是,你想做什么需要等等?IORef
0赞 user8930358 11/13/2017
我有一个一遍又一遍地运行的游戏循环,我需要读取输入并相应地更新值/输出,如果一切都是不可变的,我不知道你应该怎么做
0赞 shree.pat18 11/13/2017
明白了。也许您可以使用上述内容更新您的问题,并提供一些示例数据,以便我们可以看到另一种解决方案?

答:

1赞 ice1000 11/13/2017 #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

评论

0赞 chi 11/13/2017
这不会进行类型检查。上面是一个 ,然后用作 .不过,只要稍多一点工作,它应该可以工作。xIORef IntString
0赞 user8930358 11/13/2017
@chi 我将参数更改为 IORef Int -- 如何打印它?我试过了等等,没有任何效果print $ xprint (readIORef x)
0赞 chi 11/13/2017
@user8930358 尝试或拆分读取和打印:如print =<< readIORef xdo .... ; xVal <- readIORef x ; print xVal
0赞 user8930358 11/13/2017
@chi 我必须用空格分隔符在同一行上打印其中两个,具体来说,语法会让我这样做,还是我必须使用您的第二种方法进行一些字符串转换?print =<< readIORef x
0赞 user8930358 11/13/2017
看起来在做和导入后可以工作,虽然我不知道这是否是非标准的printf "%d %d" x_out y_outx_out <- readIORef xText.Printf