提问人:user8930358 提问时间:11/13/2017 最后编辑:ice1000user8930358 更新时间:11/13/2017 访问量:775
为什么这个变量不在范围之内?(哈斯克尔)
Why is this variable out of scope? (Haskell)
问:
我会直接开始(我删除了一堆无关的代码,以防这看起来有点有趣 - 试图让它成为 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赞
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
这不会进行类型检查。上面是一个 ,然后用作 .不过,只要稍多一点工作,它应该可以工作。x
IORef Int
String
0赞
user8930358
11/13/2017
@chi 我将参数更改为 IORef Int -- 如何打印它?我试过了等等,没有任何效果print $ x
print (readIORef x)
0赞
chi
11/13/2017
@user8930358 尝试或拆分读取和打印:如print =<< readIORef x
do .... ; 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_out
x_out <- readIORef x
Text.Printf
评论
loop
x
IORef