../

Installing IHaskell on Ubuntu 16.04 with Stack

└─ 2017-10-07 • Reading time: ~4 minutes

Last year I wrote a tutorial to install iHaskell on Ubuntu 14.04. Since it’s a bit out-dated now, but I still think iHaskell can be super useful, I decided to update it for Ubuntu 16.04.

Before we start, please be aware that you can use IHaskell directly in your browser by visiting this website: try.jupyter.org. The following tutorial is only meant for those who want IHaskell to run locally.

Install Stack

Compared to Ubuntu 14.04, it is now easier to install stack thanks to the haskell-stack package:

$ sudo apt-get install haskell-stack

Now let’s make sure we have the latest version of stack, as well as the latest snapshot from stackage:

$ stack upgrade
$ stack update
$ stack setup

Dependencies

Some dependencies are required before building the IHaskell kernel, let’s install them:

$ sudo apt-get install -y   \
    git                     \
    libtinfo-dev            \
    libzmq3-dev             \
    libcairo2-dev           \
    libpango1.0-dev         \
    libmagic-dev            \
    libblas-dev             \
    liblapack-dev

Install Jupyter

IHaskell requires a recent version of Jupyter, so we need to install it ourselves. There are several options:

  1. Use pip and install it globally (pip install jupyter)
  2. Use pip and install it in a virtualenv
  3. Use nix (You’re on your own)
  4. Use conda (conda update jupyter)

Let’s go with option 2.. I usually never install python packages globally using sudo pip, and prefer to create a fresh virtualenv for each project. Let’s proceed!

If you’re on a fresh install, we need to install virtualenv first:

$ sudo apt-get install virtualenv python3-dev ncurses-base

Then let’s install jupyter inside of our virtualenv virtualenv:

$ virtualenv venv-ihaskell -p /usr/bin/python3 # Create a virtualenv
$ source venv-ihaskell/bin/activate # Active it
$ pip install                                   \
    jupyter==1.0.0                              \
    jupyter-contrib-core==0.3.3                 \
    jupyter-contrib-nbextensions==0.3.1         \
    jupyter-highlight-selected-word==0.0.11     \
    jupyter-latex-envs==1.3.8.4                 \
    jupyter-nbextensions-configurator==0.2.8

Install IHaskell

Since IHaskell is not available in the latest stackage LTS snapshot, we have two options to install it:

  • Compile from source
  • Use the latest snapshot supporting IHaskell (lts-6.35)

I will present both methods.

From source

The instructions can be found in the github repository:

$ source ihaskell-venv/bin/activate
$ git clone git@github.com:gibiansky/IHaskell.git
$ cd IHaskell
$ pip install -r requirements.txt
$ stack setup
$ stack install gtk2hs-buildtools
$ stack install --fast
$ stack exec ihaskell -- install --stack

Then it can be started using:

$ stack exec jupyter -- notebook

From stackage lts-6.35

Unfortunately, it is not possible to build IHaskell using the latest snapshot, as it does not seem to work with GHC 8.x. The latest supported LTS snapshot is 6.35, so we will have to specify it explicitly:

$ stack --resolver lts-6.35 setup --install-ghc
$ stack --resolver lts-6.35 install ihaskell
$ stack --resolver lts-6.35 exec ihaskell -- install --stack

You may want to install extra packages to enhance IHaskell’s capabilities. Here are the ones supported by stackage:

  • ihaskell-aeson
  • ihaskell-basic
  • ihaskell-blaze
  • ihaskell-charts
  • ihaskell-diagrams
  • ihaskell-hatex
  • ihaskell-inline-r
  • ihaskell-juicypixels
  • ihaskell-magic
  • ihaskell-rlangqq

Some others are not in the snapshot, but could be very useful and can probably be installed from source:

  • ihaskell-widgets
  • ihaskell-parsec
  • ihaskell-plot

What’s next

The installation of IHaskell on Ubuntu 16.04 is a bit easier than on 14.04 thanks to more up-to-date dependencies. Unfortunately, the latest IHaskell is not available on stackage LTS, which requires to use an older snapshot (6.35). It is still possible to build IHaskell from source, which allows you to run the latest version of the code! It’s up to you to choose the method you prefer.