L.S.,

In my enthusiasm to reduce imperative style coding to a minimum, I changed a program to something too lazy to do anything. The following is an extremely simplified version of the program:

import Monad

displayFile1 :: IO (IO ())displayFile1 = liftM putStr contents -- Displays nothing
where
contents :: IO [Char]
contents = readFile "DisplayFile.lhs"

This should display the contents of a file, but nothing appears. The following function should be exactly the same, but this one does display the file:


displayFile2 :: IO ()
displayFile2 =  do
    contents <- readFile "DisplayFile.lhs"
    putStr contents

My conclusion is, that "putStr" is evaluated strictly, while "liftM putStr" is not.


I have the following questions:
- Why is this difference?
- Is there some method to predict whether my program is sufficiently strict to really do what it is supposed to do?
- Did someone design a method to develop programs not too strict and not too lazy?
- The manual "A gentle introduction to Haskell" states in section 6.3: "adding strictness flags may lead to hard to find infinite loops or have other unexpected consequences"; I would like to know when these problems arise; are these cases described somewhere?


--
Met vriendelijke groet,
Herzliche GrÃÃe,
Best regards,
Henk-Jan van Tuyl


-------------------------------------------------------------------- Festina Lente Hasten Slowly Haast U langzaam Eile langsam Skynd dig langsomt Affrettati lentamente SpÄchej pomalu Skynda lÃngsamt Desiderius Erasmus -------------------------------------------------------------------- _______________________________________________ Haskell-Cafe mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to