Posts

Getting started with Frege: Hello World and basic setup using Maven

I spent a couple of hours playing with Frege (Haskell on the JVM) and not much documentation tutorials seems available. I am trying to help writing this simple Hello World tutorial.

The code is available on Github: https://github.com/ftomassetti/frege-tutorial/tree/01_HelloWorld

Update: Frege has some very useful documentation at http://www.frege-lang.org/doc/… where … represents the package, or module, name. For example, if one needs some reference for the frege.java.util.Regex package, one looks at http://www.frege-lang.org/doc/frege/java/util/Regex.html

Frege source code

The code is very simple for our little hello world example. In this tutorial we focus mainly on configuring our environment.

We declare the name of module to be HelloWorld. It will affect the name of the Java class produced.

The third line defines the type signature of the main function, while the fourth lines define main as a call to putStrLn using an IO Monad. In practice, you have to do the operations which affect the real world (like reading from a file or writing to the screen) inside a do statement. The reason is that the compiler treat them differently from pure functions, which can be optimized in several ways (lazyness, memoization, etc.) while “realworld operations” cannot.

Writing the POM (Maven configuration file)

First let’s take a look to the whole file:

The dependencies contain frege, no surprises here:

We then use two plugins, to compile Frege code and Java code:

Finally we save the classpath used by Maven in a file (classpath.conf) by using  the maven-dependency-plugin

The classpath.conf file will be useful for running the application using the run.sh script.

Running the application, the run.sh script

To run the application we need the frege jar and the classes generated from our frege source code.

Compile and running HelloWorld

After cloning the repository, you can simply run:

The result, should be something like:

[federico@normandie frege-tutorial]$ sh run.sh
Hello world. Frege is a lot of fun!
runtime 0.001 wallclock seconds.

 

Exploring frege: Haskell for the JVM

Recently I played a lot with Clojure and as part of my playing I built a civilizations simulator named civs. I really love building applications at the REPL and my Clojure code is much clearer and easier to read than the Java code I could have written for it

but…

when you need to refactor significantly your code it is going to be painful. Probably you can limit the issue with appropriate design choices and there is the possibility to use different forms of optional typing in Clojure, but still, you will miss a compiler helping you figure out what functions you need to revisit because of your small change in a data structure. Sure, I should add use different abstractions but…

So, I spent some time trying to figure out which functional static typed language was worthy to spend some time on, just to know better my options. I considered:

OCaml: it seems that the adoption is declining more and more according to different metrics and the current compilers do not support multithread, which seems a capital sin.

Scala: I have used it just to build an incremental parser for Java and I dislike it. It tries to be too many things at the same time and remember me C++, at the good old times when language designers taught that supporting more and more and more features in a language was a nice thing. That and the awful tool support made me decise that I do not want to touch it neither with a pole, unless forced too.

Haskell: what else is left? SML?

Now, as part of my job at TripAdvisor I am learning to be more and more practical and getting things done. I have already some investments done in the JVM environment. For example my world generator (lands) can be used through Jython on the JVM as well as the name generator (namegen) and a few other things that are written in Java or Clojure (no stuff left in JRuby, right?). So it would be great to have Haskell for the JVM…

…and then is when Frege comes to the rescue! It is just this, a port of Haskell to the JVM.

Basic toolchain

From the Github page you can download the jars you need. Visit this page: https://github.com/Frege/frege

You can play with the REPL and when you want to compile & run:

java -jar ~/tools/frege3.21.586-g026e8d7.jar main.fr
java -cp ~/tools/frege3.21.586-g026e8d7.jar:. Main

A small difference between Haskell and Frege

While in Haskell I would write:


data Name = String | Unnamed
deriving Show

 

In Frege I need to write:


data Name = String | Unnamed
derive Show Name -- no spaces at the beginning of the line. Yes, it matters

What derive means translated in Java? It means more or less I am too lazy to write the toString method for this class (Name) so please do the usual thing auto-magically and implement it for me.

A first example

So I started to create a few types to run the civilization simulator in Frege:

 

Running the first example

Screenshot from 2014-09-20 14:32:50

So far Frege seems stable, easy to install and very close to Haskell. Now I want to play more with the Java integration.