Haskell: I/O and Returning From a Function
In most functional languages, this would work. However, Haskell is a pure functional language. You are not allowed to do IO in functions, so the function can either be
-
[Int] -> [Int]
without performing any IO or -
[Int] -> IO [Int]
with IO
The type of dot
as inferred by the compiler is dot :: (Show t) => [t] -> IO [t]
but you can declare it to be [Int] -> IO [Int]
:
dot :: [Int] -> IO [Int]
See IO monad: http://book.realworldhaskell.org/read/io.html
I haven't mentioned System.IO.Unsafe.unsafePerformIO
that should be used with great care and with a firm understanding of its consequences.
No, either your function causes side effects (aka IO, in this case printing on the screen), or it doesn't. print
does IO and therefore returns something in IO
and this can not be undone.
And it would be a bad thing if the compiler could be tricked into forgetting about the IO
. For example if your [Integer] -> [Integer]
function is called several times in your program with the same parameters (like []
for example), the compiler might perfectly well just execute the function only once and use the result of that in all the places where the function got "called". Your "hidden" print would only be executed once even though you called the function in several places.
But the type system protects you and makes sure that all function that use IO
, even if only indirectly, have an IO
type to reflect this. If you want a pure function you cannot use print
in it.