Printing to Standard Out

The Flix prelude defines two impure functions: print and println that can be used to print a string to standard out. For example:

println("Hello World")

The println function prints with a newline after the string. The print function can be used to print without this newline. For example:

let name = "Lucky Luke";
print("Hello");
print(" ");
println(name)

which prints Hello Lucky Luke on one line.

The print and println functions can print any value whose type implements ToString type class and consequently can be converted to a String. For example:

let o = Some(123);
let l = 1 :: 2 :: 3 :: Nil;
println(o);
println(l)

The print and println functions are rightfully Impure. Consequently they cannot be called from a pure context. This can sometimes hinder debugging of a pure function where you want to log some intermediate computation. A solution is to cast the print and println functions as Pure. Here is an example:

def sum(x: Int32, y: Int32): Int32 =
    let _ = println(x) as \ {};
    let _ = println(y) as \ {};
    x + y

Note that sum remains a pure function despite the two calls to println. Moreover, since the call println(x) is pure we must introduce a let-binding with an unused variable to prevent Flix from rejecting the program due to a redundant pure computation.