2015-05-30 53 views
2

我有這樣的代碼在函數內部副作用... -> IO()這段代碼如何進入無限循環?又名如何在Haskell中實現一個計數器?

let index_player = (-1) 
dronePositionByPlayer <- replicateM nb_players $ do 

    let index_player = index_player + 1 

    dronePositions <- replicateM nb_drones $ do 
     input_line <- getLine 
     let input = words input_line 
     let dx = read (input!!0) :: Int 
     let dy = read (input!!1) :: Int 
     let dronePosition = DronePosition (Position dx dy) index_player 
     hPutStrLn stderr $ "position = " ++ show dronePosition 
     return (dronePosition) 
    return (dronePositions) 

當我執行它,在解析的輸入數據(這是包含每個的x和y位置的幾行)我對參考標準此跟蹤錯誤輸出:

position = DronePosition (Position 703 892) Answer: <<loop>> 

很明顯,它可以讀取第一的位置,但隨後它會在無限循環,可能是想顯示的字段index_player

DronePositionPosition是簡單的代數數據類型:

data Position = Position Int Int deriving Show 
data DronePosition = DronePosition Position Drone deriving Show 

是形成不良的在我的代碼是什麼?

回答

9
let index_player = index_player + 1 

上面是遞歸定義,導致index_player變量通過加入一種遞歸來計算 - 永遠。這並不終止。它沒有引用上面幾行聲明的同名變量。

如果你想要一個循環,你可以適應例如

xs <- forM [0..100] $ \i -> do 
    print i 
    return (1000 + i) 

上面打印所有的數字從0到100,並且限定xs是所有返回的號碼的列表,即[1000..1100]。請記住import Control.Monad使用forM

相關問題