这段代码如何进入无限循环?又如何在Haskell中实现计数器?

Ste*_*and 2 counter haskell infinite-loop

我在带有副作用的函数中有这个代码 ... -> IO()

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)
Run Code Online (Sandbox Code Playgroud)

当我执行它时,在解析输入数据(包含每个x和y位置的几行)时,我在标准错误输出上有这样的跟踪:

position = DronePosition (Position 703 892) Answer: <<loop>> 
Run Code Online (Sandbox Code Playgroud)

显然它可以读取第一个位置,但随后它会进入无限循环,可能会尝试显示该字段index_player.

DronePosition并且Position是简单的代数数据类型:

data Position = Position Int Int deriving Show
data DronePosition = DronePosition Position Drone deriving Show
Run Code Online (Sandbox Code Playgroud)

什么是我的代码中的不良形式?

chi*_*chi 9

let index_player = index_player + 1
Run Code Online (Sandbox Code Playgroud)

以上是递归定义,导致index_player通过递归地添加一个变量来计算变量 - 永远.那不会终止.它没有引用上面几行声明的同名的前一个变量.

如果你想要一个循环,你可以适应例如

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

以上打印从0到100的所有数字,并定义xs为所有返回的数字的列表,即[1000..1100].记得import Control.Monad要使用forM.