Problems with IO an laziness

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Problems with IO an laziness

Dmitry Mamontov
I am a Haskell beginner. I've tried to write a tiny VM-like thing but ran into a problems with IO and evaluation order.

Here is the full source code of this VM: https://gist.github.com/mamontov-cpp/c4d8e2e46e7541c0c646 . This code is supposed to read 4 strings and output them in reverse order.

While it seems to read some strings, it requests much more than one string from user on each step of evaluation of meta-program, stored as array in main function (which is just wrong).

I assume the problem with this program, is that the main state, being immutable, seems to get re-evaluated on several steps inside of internal parts of runProgram and runInstructionOrStop, forcing it to repeat requesting data from user.

So, how can I prevent this main state from being re-evaluated in following code ? Or is there any other problems, which I don't see?




_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: Problems with IO an laziness

Sylvain HENRY
Hi,
The problem is in your "runProgram" and "runInstructionOrStop" functions: their "state" parameter should have type "ProgramState" and not "IO ProgramState" and they have to be fixed accordingly.

With your code, you "append new actions" (opReadString "a", etc.) to "state" with "(state >>= (getInstruction pos program))" and you execute the whole program up to the current instruction each time in "(fmap (checkProgramBounds program) state)" and "(fmap position state)".

In addition, this is what I would do to enhance your code (in order):
1) Use do-notation in runProgram and runInstructionOrStop (i.e. remove "perform" let-bindings and ">>=") to make the code easier to understand.
2) Don't store the program in a list: length and (!!) are O(n) with lists. Use Vector instead.
3) Put the program in ProgramState
4) More advanced (State monad + monad transformers): use a Program type defined as: type Program a = StateT ProgramState IO a
5) Rewrite runProgram and runInstructionOrStop with "sequence" from Control.Monad

Regards,
Sylvain


2016-02-17 21:13 GMT+01:00 Dmitry Mamontov <[hidden email]>:
I am a Haskell beginner. I've tried to write a tiny VM-like thing but ran into a problems with IO and evaluation order.

Here is the full source code of this VM: https://gist.github.com/mamontov-cpp/c4d8e2e46e7541c0c646 . This code is supposed to read 4 strings and output them in reverse order.

While it seems to read some strings, it requests much more than one string from user on each step of evaluation of meta-program, stored as array in main function (which is just wrong).

I assume the problem with this program, is that the main state, being immutable, seems to get re-evaluated on several steps inside of internal parts of runProgram and runInstructionOrStop, forcing it to repeat requesting data from user.

So, how can I prevent this main state from being re-evaluated in following code ? Or is there any other problems, which I don't see?




_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners



_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: Problems with IO an laziness

Dmitry Mamontov
In reply to this post by Dmitry Mamontov
Thanks for your help. This solved my problems.

_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners