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)
什么是我的代码中的不良形式?
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.
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |