Haskell as a functional language has three language barriers to programmers like me with an imperative object-oriented background: syntax, terminology and concepts. Luckily, we neither need to use FP lingo like "currying" nor best-practice Haskell syntax.
import Prelude hiding ((.))
x.f = f(x)
main = do {
print("Hello World!");
"Hello World!".print;
}We have tweaked Haskell's preloaded module Prelude, which comes with a bunch of useful functions such as print as well as a . operator of its own, which we had to re-implement in line 2 according to our own imperative/object-oriented needs. Click on the play button and see for yourself: "Hello World!".print has become a valid expression, too!
Since functions without parenthesis look awkward, let's define an additional apply function that makes our code look even more object-oriented.
import Prelude hiding ((.))
x.f = f(x)
f `apply` x = f(x)
main = do {
print("Hello World!");
"Hello World!".apply(print);
}Since x.apply(f) is not "native" Haskell, we can't use it in a function declaration. Instead, we had to use f `apply` x, which is the same. In the next tutorial we will see why.