2017-11-13 18 views
0

私は(これはちょっとおかしい場合には、私は、余分なコードの束を削除 - この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

「ループ」に入力パラメータを受け入れて「x」を渡すことはできますか? –

+0

私は方法はわかりませんが、それを行うには有効な方法だと私は思っています – user8930358

+4

もっと重要なのは、あなたがしようとしているのは 'IORef'なのですか? –

答えて

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

これはタイプチェックを行いません。上記の 'x'は' IORef Int'で、 'String'として使われます。少しでも作業すればうまくいくはずです。 @おかげさまで – chi

+0

。私は 'String'を' Int'に変更しました。 – ice1000

+0

これはうまくいかず、Int – user8930358

関連する問題