Move to ghc 7.8.2 on MacOSX
Lately I’ve been playing with some functional languages: haskell, lisp (in particular the scheme dialect, see e.g. chicken or racket) and elixir (I very much like it and I really appreciate that it runs on the erlang VM).
Each of those has something pretty unique and I believe is very worth learning. I cannot stress how much material you can find both online and in libraries to learn them (except for elixir but its website does a really good job and there will be plenty of books very soon out) and how strong thay can change your way of programming.
This post is about installing a recent version of gch
to play with haskell.
I started using haskell by installing ghc
, the Glasgow Haskell Compiler (pretty much the de fact standard of haskell compilers), via Homebrew. And then installing haskell-platform
(again using Homebrew) to find out, not much later, that I only needed the cabal-install
package (at that time installed via Homebrew too after removing the platform).
Recently, ghc
reached version 7.8
, and that shipped a huge amount of improvements. With my huge disappointemnt, all the packages installed via Homebrew were supporting only ghc 7.6 and I had hard times with dependencies, multiple packages and so on…
The solution was pretty simple and straightforward in the end, and I believe this could be handy for other people too strognly enough to write this post.
First of all I uninstalled ghc 7.6, cabal-install or haskell platform (if you have it). Then I reinstalled the 7.8 branch of ghc, thanks to Homebrew that was pretty straightforward:
brew install ghc --devel
Additionally I had to remove the .cabal
and .ghc
folder in my home. There were pieces of configurations that were creating some conflicts, move them if you feel unsure and want to avoid the deletion.
Then I needed cabal-install
. This requires slightly more work, especially it didn’t quite work for me when I followed the instructions.
First download the sources for cabal-install
from here. Just the cabal-install tool
sources, it is going to update the Cabal
library during its setup.
Untar the file, e.g.
tar zxvf cabal-install-1.20.0.2.tar.gz
and enter the newly created folder, e.g
cd cabal-install-1.20.0.2
Now it all reduces to run
./bootstrap.sh --no-doc
(append --global
if you prefer to install it in /usr/local
instead of $HOME/cabal
).
The --no-docs
flag seemed necessary to avoid a number of errors appearing in the compilation process and forcing me to install a number of packages by hand. Sadly I could not figure out the problem in the script yet, but that flag seems a reasonable workaround and I will install the docs later anyhow.
You may still get some error related to broken package, in such cas just ghc-pkg unregister <brokenpackagename>
and rerun the script (in my case they were text
and mtl
).
When cabal is installed it is a good idea to run
cabal update
and follow the instructions.
Remember that .cabal/bin
must be in your $PATH
.
To learn coding in haskell there are few great sources. I think Learn yourself a Haskell for Great Good! is a good place to start, maybe not perfect and not complete but I really really enjoied it (and learnt a lot).
# Essential Packages for Using Haskell
Now, this section is mainly for my personal records. There is a number of packages I like to have installed for customizations, help and other stuff. Maybe some of those could interest some reader. Some of the installations will require sensible compilation times and overheating of your machine, it very much feels like installing gentoo
~10 years ago… some of you know what I mean :)
I rely very much on hoogle when I code in haskell. Best part of it is that you can have it offline. First install the appropriate package with cabal install hoogle
.
You may be get a warning and be asked to run the install with the flag --force-reinstall
. Just do it: cabal install hoogle --force-reinstall
.
I’ve additionally got a strange error related to happy
and haskell-src-exts
, it can be solved just by cabal install happy
. I am still wondering why it happened.
When the setup is complete, you can run hoogle data
to create a local database of entries, or hoogle data all
if you want the complete hoogle dataset (this takes a loooong time).
If you don’t plan to use goa
or lambdabot
you can integrate hoogle
in ghci
by adding
:def hoogle \str -> return $ ":! hoogle --count=15 \"" ++ str ++ "\""
to your .ghci
file.
I believe that ghci
is nothing without lambdabot. Therefore cabal install goa lambdabot
is the inevitable second step. Note that goa
is not a mistake but a useful addition.
lambdabot <= 4.3.0.1
have some problems with ghc-7.8.2
and you will get a compilation error. To fix it you first cabal install goa
by itself, then cabal get lambdabot; cd lambdabot-4.3.0.1
and then you need to replace the content of src/Lambdabot/Monad.hs-boot
with
{-# LANGUAGE RankNTypes #-}
module Lambdabot.Monad where
import Control.Monad.Reader
import Data.IORef
data IRCRWState
data IRCRState
newtype LB a = LB {runLB :: ReaderT (IRCRState, IORef IRCRWState) IO a}
instance Monad LB
(the above code is due to artella-coding and should be merged in the next release of lambdabot).
Then save and run cabal configure && cabal install
.
Then in my .ghci
I have
:m - Prelude
:m + GOA
setLambdabotHome "/Users/marcelloseri/.cabal/bin"
:def bs lambdabot "botsnack"
:def pl lambdabot "pl"
:def unpl lambdabot "unpl"
:def redo lambdabot "redo"
:def undo lambdabot "undo"
:def index lambdabot "index"
:def docs lambdabot "docs"
:def instances lambdabot "instances"
:def hoogle lambdabot "hoogle"
:def source lambdabot "fptools"
:def where lambdabot "where"
:def version lambdabot "version"
:def src lambdabot "src"
I like to see what my code should look like. Often hlint is of great help for this (especially when you run it directly in your favourite editor, e.g. vim
and Sublime Text
): thus cabal install hlint
.
Ans speaking of editors we cannot forget ghc-mod to provide the integration: cabal install ghc-mod
.
Finally I massively use pandoc
, look at its webpage if you don’t know it. You can installe prebuild binaries but recently I restarted enjying compiling things by myself. The installation via cabal
is trivial. Just type cabal install pandoc
and wait. Maybe go to get some coffee… it’s not going to be just a couple of minutes. It may fail complaining about alex
, in such case just run cabal install alex
and run cabal install pandoc
again.
Now that my .cabal
folder is quite huge, I have everything I want to have fun with haskell.
I happen to use many more haskell packages in fact (e.g. aeson
for the json
integration) but I usually install them in local sandboxed environment and try to keep the global user folder more or less stable.