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
