February 9th, 2017

Haskell on Bash/WSL

Rich Turner
Sr. Program Manager

I’ve recently received a couple of questions asking when Haskell support would be added to WSL, and was surprised since I thought Bash/WSL users were aware of the fact that Haskell has been working for the last few weeks, ever since #14986 in fact, but it appears that we’d not explicitly communicated the fact, so … here we are! 🙂

Haskell now runs in Bash on Windows!*

** You’ll need to be running Windows 10 Insider build #14986 or later.*

Background

Haskell is a popular and powerful functional programming language which wasn’t able to run on Bash/WSL in Anniversary Update or earlier Insider builds, because WSL had not yet implemented the timer_create() syscall. Now that WSL builds >= #14986 do support timer_create() we can run Haskell and many other tools (e.g. Elm, Cabal, Pandoc, Agda, etc.) 🙂

Note: You can, as with most modern dev tools, also run Haskell very happily on Windows, although you may find some packages and add-ons require Linux, which is where the ability to run on Bash/WSL comes in!

Hello World in Haskell

Let’s create a Haskell Hello World sample:

First, install the Glasgow Haskell Compiler:

$ sudo apt install ghc

While we could run the Haskell interactive REPL, the GHC compiler can, of course, also compile Linux executables:

Open your favorite Linux editor (mine is Vim) creating a new hello.hs file

$ vim hello.hs

Now enter the following Haskell code:

main = putStrLn "Hello World!"

This declares a main function whose implementation calls putStrLn that writes “Hello World” to stdout.

After exiting your editor (:wq[Enter] in Vim ;)), compile this file by typing the following:

$ ghc hello.hs -o hello
[1 of 1] Compiling Main             ( hello.hs, hello.o )
Linking hello ...

This will generate a Linux ELF64 binary file called hello, along with hello.hi and hello.o, which are just intermediate compilation files. You can check the hello binary using the file tool:

$ file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=0296a5fedb69302e0310bbcb7a8bea8f860a52c5, not stripped

You can now run the binary (note: the ./ prefix is required when executing a local binary):

$ ./hello  Hello World!

Congratulations, you’re now on your way to being a Haskell guru 🙂

 

Author

Rich Turner
Sr. Program Manager

Geek, Nerd, Hacker. Fan of Rugby, Motorcycles, Skiing, Outdoor activities.

0 comments

Discussion are closed.

'; block.insertAdjacentElement('beforebegin', codeheader); let button = codeheader.querySelector('.copy-button'); button.addEventListener("click", async () => { let blockToCopy = block; await copyCode(blockToCopy, button); }); } }); async function copyCode(blockToCopy, button) { let code = blockToCopy.querySelector("code"); let text = ''; if (code) { text = code.innerText; } else { text = blockToCopy.innerText; } try { await navigator.clipboard.writeText(text); } catch (err) { console.error('Failed to copy:', err); } button.innerText = "Copied"; setTimeout(() => { button.innerHTML = '' + svgCodeIcon + ' Copy'; }, 1400); }