How could this code enter an infinite loop? aka how to implement a counter in Haskell? -
i have code inside function side effects ... -> io()
let index_player = (-1) dronepositionbyplayer <- replicatem nb_players $ let index_player = index_player + 1 dronepositions <- replicatem nb_drones $ 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) when execute it, while parsing input data (which several lines containing each x , y position) have trace on stardard error output:
position = droneposition (position 703 892) answer: <<loop>> obviously can read first position, goes in infinite-loop, trying display field index_player.
droneposition , position simple algebraic datatypes:
data position = position int int deriving show data droneposition = droneposition position drone deriving show what ill-formed in code ?
let index_player = index_player + 1 the above recursive definition, resulting in index_player variable computed adding 1 recursively -- forever. not terminate. not refer previous variable of same name declared few lines above.
if want loop, can adapt e.g.
xs <- form [0..100] $ \i -> print return (1000 + i) the above prints numbers 0 100, , defines xs list of returned numbers, i.e. [1000..1100]. remember import control.monad use form.
Comments
Post a Comment