# Visualizing lazy evaluation

Monday, 18 September 2017, by Edsko de Vries.

Filed under coding.

Haskell and other call-by-need languages use *lazy evaluation* as their default evaluation strategy. For beginners and advanced programmers alike this can sometimes be confusing. At Well-Typed a core part of our business is teaching Haskell, which we do through public courses (such as the upcoming Skills Matter courses Fast Track to Haskell, Haskell Performance and Optimization and The Haskell Type System), private in-house courses targeted at specific client needs, and of course through writing blog posts.

In order to help us design these courses, we developed a tool called `visualize-cbn`

. It is a simple interpreter for a mini Haskell-like language which outputs the state of the program at every step in a human readable format. It can also generate a HTML/JavaScript version with “Previous” and “Next” buttons to step through a program. We released the tool as open source to github and Hackage, in the hope that it will be useful to others.

The `README.md`

file in the repo explains how to run the tool. In this blog post we will illustrate how one might take advantage of it. We will revisit the infamous triple of functions `foldr`

, `foldl`

, `foldl'`

, and show how they behave. As a slightly more advanced example, we will also study the memory behaviour of `mapM`

in the `Maybe`

monad. Hopefully, this show-rather-than-tell blog post might help some people understand these functions better.

# Binary instances for GADTs

(or: RTTI in Haskell)

Thursday, 15 June 2017, by Edsko de Vries.

Filed under coding.

In this blog post we consider the problem of defining `Binary`

instances for GADTs such as

```
data Val :: * -> * where
VI :: Int -> Val Int
VD :: Double -> Val Double
```

If you want to play along the full source code for the examples in this blog post can be found on github.

## Failed attempt

The “obvious” way in which you might attempt to serialize and deserialize `Val`

could look something like

```
instance Binary (Val a) where
put (VI i) = putWord8 0 >> put i
put (VD d) = putWord8 1 >> put d
get = do
tag <- getWord8
case tag of
0 -> VI <$> get -- Couldn't match type ‘a’ with ‘Int’
1 -> VD <$> get -- Couldn't match type ‘a’ with ‘Double’
_ -> error "invalid tag"
```

However, this does not work. The definition of `put`

is type correct (but dubious), but the definition of `get`

is not type correct. And actually this makes sense: we are claiming that we can define `Binary (Val a)`

*for any* `a`

; but if the tag is 0, then that `a`

can only be `Int`

, and if the tag is 1, then that `a`

can only be `Double`

.

One option is to instead give a `Binary (Some Val)`

instance with `Some`

defined as

```
data Some :: (* -> *) -> * where
Exists :: forall f x. f x -> Some f
```

That is often independently useful, but is a different goal: in such a case we are *discovering* type information when we deserialize. That’s not what we’re trying to achieve in this blog post; we want to write a `Binary`

instance that can be used when we know from the context what the type must be.

## Working, but inconvenient

The next thing we might try is to introduce `Binary`

instances for the specific instantiations of that `a`

type variable:

```
instance Binary (Val Int) where
put (VI i) = put i
get = VI <$> get
instance Binary (Val Double) where
put (VD d) = put d
get = VD <$> get
```

Note that there is no need to worry about any tags in the encoded bytestring; we always know the type. Although this works, it’s not very convenient; for example, we cannot define

```
encodeVal :: Val a -> ByteString
encodeVal = encode
```

because we don’t have a polymorphic instance `Binary (Val a)`

. Instead we’d have to define

```
encodeVal :: Binary (Val a) => Val a -> ByteString
encodeVal = encode
```

but that’s annoying: we *know* that that `a`

can only be `Int`

or `Double`

, and we have `Binary`

instances for both of those cases. Can’t we do better?

## Introducing RTTI

Although *we* know that `a`

can only be `Int`

or `Double`

, we cannot take advantage of this information in the code. Haskell types are erased at compile time, and hence we cannot do any kind of pattern matching on them. The key to solving this problem then is to introduce some explicit runtime type information (RTTI).

We start by introducing a data family associating with each indexed datatype a corresponding datatype with RTTI:

`data family RTTI (f :: k -> *) :: (k -> *)`

For the example `Val`

this runtime type information tells us whether we’re dealing with `Int`

or `Double`

:

```
data instance RTTI Val a where
RttiValInt :: RTTI Val Int
RttiValDouble :: RTTI Val Double
```

For serialization we don’t need to make use of this:

```
putVal :: Val a -> Put
putVal (VI i) = put i
putVal (VD d) = put d
```

but for *deserialization* we can now pattern match on the RTTI to figure out what kind of value we’re expecting:

```
getVal :: RTTI Val a -> Get (Val a)
getVal RttiValInt = VI <$> get
getVal RttiValDouble = VD <$> get
```

We’re now almost done: the last thing we need to express is that if we know *at the type level* that we have some RTTI available, *then* we can serialize. For this purpose we introduce a type class that returns the RTTI:

```
class HasRTTI f a where
rtti :: RTTI f a
```

which we can use as follows:

```
instance HasRTTI Val a => Binary (Val a) where
put = putVal
get = getVal rtti
```

This states precisely what we described in words above: as long as we have some RTTI available, we can serialize and deserialize any kind of `Val`

value.

The last piece of the puzzle is to define some instances for `HasRTTI`

; right now, if we try to do `encode (VI 1234)`

ghc will complain

`No instance for (HasRTTI Val Int)`

Fortunately, these instances are easily defined:

```
instance HasRTTI Val Int where rtti = RttiValInt
instance HasRTTI Val Double where rtti = RttiValDouble
```

and the good news is that this means that whenever we construct specific `Val`

s we never have to construct the RTTI by hand; ghc’s type class resolution takes care of it for us.

## Taking stock

Instead of writing

```
encodeVal :: Binary (Val a) => Val a -> ByteString
encodeVal = encode
```

we can now write

```
encodeVal :: HasRTTI Val a => Val a -> ByteString
encodeVal = encode
```

While it may seem we haven’t gained very much, `HasRTTI`

is a much more fine-grained constraint than `Binary`

; from `HasRTTI`

we can derive `Binary`

constraints, like we have done here, but also other constraints that rely on RTTI. So while we do still have to carry these RTTI constraints around, those are – ideally – the *only* constraints that we still need to carry around. Moreover, as we shall see a little bit further down, RTTI also scales nicely to composite type-level structures such as type-level lists.

## Another example: heterogeneous lists

As a second—slightly more involved—example, lets consider heterogeneous lists or *n*-ary products:

```
data NP (f :: k -> *) (xs :: [k]) where
Nil :: NP f '[]
(:*) :: f x -> NP f xs -> NP f (x ': xs)
```

An example of such a heterogeneous list is

`VI 12 :* VD 34.56 :* Nil :: NP Val '[Int, Double]`

The type here says that this is a list of two `Val`

s, the first `Val`

being indexed by `Int`

and the second `Val`

being indexed by `Double`

. If that makes zero sense to you, you may wish to study Well-Typed’s Applying Type-Level and Generic Programming in Haskell lecture notes.

As was the case for `Val`

, we always *statically* know how long such a list is, so there should be no need to include any kind of length information in the encoded bytestring. Again, for serialization we don’t need to do anything very special:

```
putNP :: All Binary f xs => NP f xs -> Put
putNP Nil = return ()
putNP (x :* xs) = put x >> putNP xs
```

The only minor complication here is that we need `Binary`

instances for all the elements of the list; we guarantee this using the `All`

type family (which is a minor generalization of the `All`

type family explained in the same set of lecture notes linked above):

```
type family All p f xs :: Constraint where
All p f '[] = ()
All p f (x ': xs) = (p (f x), All p f xs)
```

Deserialization however needs to make use of RTTI again. This means we need to define what we mean by RTTI for these heterogenous lists:

```
data instance RTTI (NP f) xs where
RttiNpNil :: RTTI (NP f) '[]
RttiNpCons :: (HasRTTI f x, HasRTTI (NP f) xs)
=> RTTI (NP f) (x ': xs)
instance HasRTTI (NP f) '[] where
rtti = RttiNpNil
instance (HasRTTI f x, HasRTTI (NP f) xs)
=> HasRTTI (NP f) (x ': xs) where
rtti = RttiNpCons
```

In this case the RTTI gives us the shape of the list. We can take advantage of this during deserialization:

```
getNP :: All Binary f xs => RTTI (NP f) xs -> Get (NP f xs)
getNP RttiNpNil = return Nil
getNP RttiNpCons = (:*) <$> get <*> getNP rtti
```

allowing us to give the `Binary`

instance as follows:

```
instance (All Binary f xs, HasRTTI (NP f) xs)
=> Binary (NP f xs) where
put = putNP
get = getNP rtti
```

## Serializing lists of `Val`

s

If we use this `Binary`

instance to serialize a list of `Val`

s, we would end up with a type such as

```
decodeVals :: (HasRTTI (NP Val) xs, All Binary Val xs)
=> ByteString -> NP Val xs
decodeVals = decode
```

This `All Binary Val xs`

constraint however is unfortunate, because we *know* that all `Val`

s can be deserialized! Fortunately, we can do better. The RTTI for the `(:*)`

case (`RttiNpCons`

) included RTTI for the *elements* of the list. We made no use of that above, but we *can* make use of that when giving a specialized instance for lists of `Val`

s:

```
putNpVal :: NP Val xs -> Put
putNpVal Nil = return ()
putNpVal (x :* xs) = putVal x >> putNpVal xs
getNpVal :: RTTI (NP Val) xs -> Get (NP Val xs)
getNpVal RttiNpNil = return Nil
getNpVal RttiNpCons = (:*) <$> get <*> getNpVal rtti
instance {-# OVERLAPPING #-} HasRTTI (NP Val) xs
=> Binary (NP Val xs) where
put = putNpVal
get = getNpVal rtti
```

This allows us to define

```
decodeVals :: HasRTTI (NP Val) xs => ByteString -> NP Val xs
decodeVals = decode
```

Note that this use of overlapping type classes instances is perfectly safe: the overlapping instance is fully compatible with the overlapped instance, so it doesn’t make a difference which one gets picked. The overlapped instance just allows us to be more economical with our constraints.

Here we can appreciate the choice of `RTTI`

being a data family indexed by `f`

; indeed the constraint `HasRTTI f x`

in `RttiNpCons`

is generic as possible. Concretely, `decodeVals`

required *only* a single `HasRTTI`

constraint, as promised above. It is this compositionality, along with the fact that we can derive many type classes from just having RTTI around, that gives this approach its strength.

## Advanced example

To show how all this might work in a more advanced example, consider the following EDSL describing simple functions:

```
data Fn :: (*,*) -> * where
Exp :: Fn '(Double, Double)
Sqrt :: Fn '(Double, Double)
Mod :: Int -> Fn '(Int, Int)
Round :: Fn '(Double, Int)
Comp :: (HasRTTI Fn '(b,c), HasRTTI Fn '(a,b))
=> Fn '(b,c) -> Fn '(a,b) -> Fn '(a,c)
```

If you are new to EDSLs (embedded languages) in Haskell, you way wish to watch the Well-Typed talk Haskell for embedded domain-specific languages. However, hopefully the intent behind `Fn`

is not too difficult to see: we have a datatype that describes functions: exponentiation, square root, integer modules, rounding, and function composition. The two type indices of `Fn`

describe the function input and output types. A simple interpreter for `Fn`

would be

```
eval :: Fn '(a,b) -> a -> b
eval Exp = exp
eval Sqrt = sqrt
eval (Mod m) = (`mod` m)
eval Round = round
eval (g `Comp` f) = eval g . eval f
```

In the remainder of this blog post we will consider how we can define a `Binary`

instance for `Fn`

. Compared to the previous examples, `Fn`

poses two new challenges:

- The type index does not uniquely determine which constructor is used; if the type is
`(Double, Double)`

then it could be`Exp`

,`Sqrt`

or indeed the composition of some functions. - Trickier still,
`Comp`

actually introduces an existential type: the type “in the middle”`b`

. This means that when we serialize and deserialize we*do*need to include*some*type information in the encoded bytestring.

### RTTI for `Fn`

To start with, let’s define the RTTI for `Fn`

:

```
data instance RTTI Fn ab where
RttiFnDD :: RTTI Fn '(Double, Double)
RttiFnII :: RTTI Fn '(Int, Int)
RttiFnDI :: RTTI Fn '(Double, Int)
instance HasRTTI Fn '(Double, Double) where rtti = RttiFnDD
instance HasRTTI Fn '(Int, Int) where rtti = RttiFnII
instance HasRTTI Fn '(Double, Int) where rtti = RttiFnDI
```

For our DSL of functions, we only have functions from `Double`

to `Double`

, from `Int`

to `Int`

, and from `Double`

to `Int`

(and this is closed under composition).

### Serializing type information

The next question is: when we serialize a `Comp`

constructor, how much information do we need to serialize about that existential type? To bring this into focus, let’s consider the type information we have when we are dealing with composition:

```
data RttiComp :: (*,*) -> * where
RttiComp :: RTTI Fn '(b,c) -> RTTI Fn '(a,b) -> RttiComp '(a,c)
```

Whenever we are deserializing a `Fn`

, if that `Fn`

happens to be the composition of two other functions we *know* RTTI about the composition; but since the “type in the middle” is unknown, we have no information about that at all. So what do we need to store? Let’s start with serialization:

`putRttiComp :: RTTI Fn '(a,c) -> RttiComp '(a,c) -> Put`

The first argument here is the RTTI about the composition as a whole, and sets the context. We can look at that context to determine what we need to output:

```
putRttiComp :: RTTI Fn '(a,c) -> RttiComp '(a,c) -> Put
putRttiComp rac (RttiComp rbc rab) = go rac rbc rab
where
go :: RTTI Fn '(a,c) -> RTTI Fn '(b,c) -> RTTI Fn '(a,b) -> Put
go RttiFnDD RttiFnDD RttiFnDD = return ()
go RttiFnII RttiFnII RttiFnII = return ()
go RttiFnII RttiFnDI rAB = case rAB of {}
go RttiFnDI RttiFnII RttiFnDI = putWord8 0
go RttiFnDI RttiFnDI RttiFnDD = putWord8 1
```

Let’s take a look at what’s going on here. When we know from the context that the composition has type `Double -> Double`

, then we *know* that the types of both functions in the composition must also be `Double -> Double`

, and hence we don’t need to output *any* type information. The same goes when the composition has type `Int -> Int`

, although we need to work a bit harder to convince `ghc`

in this case. However, when the composition has type `Double -> Int`

then the first function might be `Double -> Int`

and the second might be `Int -> Int`

, or the first function might be `Double -> Double`

and the second might be `Double -> Int`

. Thus, we need to distinguish between these two cases (in principle a single bit would suffice).

Having gone through this thought process, deserialization is now easy: remember that we *know* the context (the RTTI for the composition):

```
getRttiComp :: RTTI Fn '(a,c) -> Get (RttiComp '(a,c))
getRttiComp RttiFnDD = return $ RttiComp RttiFnDD RttiFnDD
getRttiComp RttiFnII = return $ RttiComp RttiFnII RttiFnII
getRttiComp RttiFnDI = do
tag <- getWord8
case tag of
0 -> return $ RttiComp RttiFnII RttiFnDI
1 -> return $ RttiComp RttiFnDI RttiFnDD
_ -> fail "invalid tag"
```

`Binary`

instance for `Fn`

The hard work is now mostly done. Although it is probably not essential, during serialization we can clarify the code by looking at the RTTI context to know which possibilities we need to consider at each type index. For example, if we are serializing a function of type `Double -> Double`

, there are three possibilities (`Exp`

, `Sqrt`

, `Comp`

). We did something similar in the previous section.

```
putAct :: RTTI Fn a -> Fn a -> Put
putAct = go
where
go :: RTTI Fn a -> Fn a -> Put
go r@RttiFnDD fn =
case fn of
Exp -> putWord8 0
Sqrt -> putWord8 1
Comp g f -> putWord8 255 >> goComp r (rtti, g) (rtti, f)
go r@RttiFnII fn =
case fn of
Mod m -> putWord8 0 >> put m
Comp g f -> putWord8 255 >> goComp r (rtti, g) (rtti, f)
go r@RttiFnDI fn =
case fn of
Round -> putWord8 0
Comp g f -> putWord8 255 >> goComp r (rtti, g) (rtti, f)
goComp :: RTTI Fn '(a,c)
-> (RTTI Fn '(b,c), Fn '(b,c))
-> (RTTI Fn '(a,b), Fn '(a,b))
-> Put
goComp rAC (rBC, g) (rAB, f) = do
putRttiComp rAC (RttiComp rBC rAB)
go rBC g
go rAB f
```

Deserialization proceeds along very similar lines; the only difficulty is that when we *deserialize* RTTI using `getRttiComp`

we somehow need to reflect that to the type level; for this purpose we can provide a function

`reflectRTTI :: RTTI f a -> (HasRTTI f a => b) -> b`

It’s definition is beyond the scope of this blog post; refer to the source code on github instead. With this function in hand however deserialization is no longer difficult:

```
getAct :: RTTI Fn a -> Get (Fn a)
getAct = go
where
go :: RTTI Fn a -> Get (Fn a)
go r@RttiFnDD = do
tag <- getWord8
case tag of
0 -> return Exp
1 -> return Sqrt
255 -> goComp r
_ -> error "invalid tag"
go r@RttiFnII = do
tag <- getWord8
case tag of
0 -> Mod <$> get
255 -> goComp r
_ -> error "invalid tag"
go r@RttiFnDI = do
tag <- getWord8
case tag of
0 -> return Round
255 -> goComp r
_ -> error "invalid tag"
goComp :: RTTI Fn '(a,c) -> Get (Fn '(a,c))
goComp rAC = do
RttiComp rBC rAB <- getRttiComp rAC
reflectRTTI rBC $ reflectRTTI rAB $
Comp <$> go rBC <*> go rAB
```

We can define the corresponding `Binary`

instance for `Fn`

simply using

```
instance HasRTTI Fn a => Binary (Fn a) where
put = putAct rtti
get = getAct rtti
```

If desired, a specialized instance for `HList Fn`

can be defined that relies only on RTTI, just like we did for `Val`

(left as exercise for the reader).

## Conclusion

Giving type class instances for GADTs, in particular for type classes that *produce* values of these GADTs (deserialization, translation from Java values, etc.) can be tricky. If not kept in check, this can result in a code base with a lot of unnecessarily complicated function signatures or frequent use of explicit computation of evidence of type class instances. By using run-time type information we can avoid this, keeping the code clean and allowing programmers to focus at the problems at hand rather than worry about type classes instances.

#### PS: Singletons

RTTI looks a lot like singletons, and indeed things can be set up in such a way that singletons would do the job. The key here is to define a new kind for the type indices; for example, instead of

```
data Val :: * -> * where
VI :: Int -> Val Int
VD :: Double -> Val Double
```

we’d write something like

```
data U = Int | Double
data instance Sing (u :: U) where
SI :: Sing 'Int
SD :: Sing 'Double
data Val :: U -> * where
VI :: Int -> Val 'Int
VD :: Double -> Val 'Double
instance SingI u => Binary (Val u) where
put (VI i) = put i
put (VD d) = put d
get = case sing :: Sing u of
SI -> VI <$> get
SD -> VD <$> get
```

In such a setup singletons can be used as RTTI. Which approach is preferable depends on questions such as are singletons already in use in the project, how much of their infrastructure can be reused, etc. A downside of using singletons rather than a more direct encoding using RTTI as I’ve presented it in this blog post is that using singletons probably means that some kind of type level decoding needs to be introduced (in this example, a type family `U -> *`

); on the other side, having specific kinds for specific purposes may also clarify the code. Either way the main ideas are the same.

# Haskell development jobs with Well-Typed

Thursday, 11 May 2017, by Andres Löh, Duncan Coutts, Adam Gundry.

Filed under well-typed.

**tl;dr** *If you’d like a job with us, send your application as soon as possible.*

We are looking for several (probably two) Haskell experts to join our team at Well-Typed. This is a great opportunity for someone who is passionate about Haskell and who is keen to improve and promote Haskell in a professional context.

### About Well-Typed

We are a team of top notch Haskell experts. Founded in 2008, we were the first company dedicated to promoting the mainstream commercial use of Haskell. To achieve this aim, we help companies that are using or moving to Haskell by providing a range of services including consulting, development, training, and support and improvement of the Haskell development tools. We work with a wide range of clients, from tiny startups to well-known multinationals. We have established a track record of technical excellence and satisfied customers.

Our company has a strong engineering culture. All our managers and decision makers are themselves Haskell developers. Most of us have an academic background and we are not afraid to apply proper computer science to customers’ problems, particularly the fruits of FP and PL research.

We are a self-funded company so we are not beholden to external investors and can concentrate on the interests of our clients, our staff and the Haskell community.

### About the jobs

Generally, the roles are not tied to a single specific project or task, and allow remote work. However, we are also looking for someone to work on a specific project with one of our clients, and that requires work on-site in London.

Please indicate in your application whether on-site work in London is an option for you.

In general, work for Well-Typed could cover any of the projects and activities that we are involved in as a company. The work may involve:

working on GHC, libraries and tools;

Haskell application development;

working directly with clients to solve their problems;

teaching Haskell and developing training materials.

We try wherever possible to arrange tasks within our team to suit peoples’ preferences and to rotate to provide variety and interest.

Well-Typed has a variety of clients. For some we do proprietary Haskell development and consulting. For others, much of the work involves open-source development and cooperating with the rest of the Haskell community: the commercial, open-source and academic users.

Our ideal candidate has excellent knowledge of Haskell, whether from industry, academia or personal interest. Familiarity with other languages, low-level programming and good software engineering practices are also useful. Good organisation and ability to manage your own time and reliably meet deadlines is important. You should also have good communication skills.

You are likely to have a bachelor’s degree or higher in computer science or a related field, although this isn’t a requirement.

Further (optional) bonus skills:

experience in teaching Haskell or other technical topics,

experience of consulting or running a business,

knowledge of and experience in applying formal methods,

familiarity with (E)DSL design,

knowledge of concurrency and/or systems programming,

experience with working on GHC,

experience with web programming (in particular front-end),

… (you tell us!)

### Offer details

The offer is initially for one year full time, with the intention of a long term arrangement. For the remote role(s), living in England is not required. For the on-site role, you have to be allowed to work in England. We may be able to offer either employment or sub-contracting, depending on the jurisdiction in which you live.

If you are interested, please apply via info@well-typed.com. Tell us why you are interested and why you would be a good fit for Well-Typed, and attach your CV. Please indicate whether the on-site work in London is an option for you. Please also indicate how soon you might be able to start.

We are more than happy to answer informal enquiries. Contact Duncan Coutts (duncan@well-typed.com, dcoutts on IRC), Adam Gundry (adam@well-typed.com, agundry on IRC) or Andres Löh (andres@well-typed.com, kosmikus on IRC) for further information.

We will consider applications as soon as we receive them, and will try to fill the positions as soon as possible. In any case, please try to get your application to us by 8 June 2017.

# Upcoming courses and events 2017

Monday, 24 April 2017, by Andres Löh.

Filed under well-typed, training.

We are excited to be teaching Haskell courses once again – in June 2017, at Skills Matter’s CodeNode venue in London.

We are offering three courses:

## Fast Track to Haskell (26-27 June)

Compact two-day course aimed at software developers with no prior experience in Haskell who want to learn the fundamentals of Haskell and functional programming.

## Guide to the Haskell Type System (28 June)

One-day course covering most of GHC’s extensions of the Haskell type system, such as GADTs, data kinds, and type families. Suitable for Haskellers who want to get most out of Haskell’s powerful type system and understand the trade-offs involved.

## Guide to Haskell Performance and Optimization (29-30 June)

Two-day course focusing on the internals of GHC, the evaluation strategy, how programs are compiled and executed at run-time. Explains how to choose the right data structure for your program in a lazy functional language, what kind of optimizations you can expect the compiler to perform, and how to write beautiful programs that scale.

Each of these courses is open for registration, with reduced rates available if you book soon.

The courses will also be held again in October 2017, in connection with the Haskell eXchange.

We also provide on-site (and remote) courses tailored to your specific needs. If you want to know more, have a look at our training page or contact us.

### Other upcoming events

The following are some other events in 2017 we are planning to participate in (we may be at other events, too):

#### ZuriHac (9-11 June 2017)

As in previous years, we’ll be at ZuriHac again, which is the largest European Haskell Hackathon. Whether you’re a newcomer who wants to try Haskell for the first time or an experienced Haskeller with many years of experience, we are looking forward to meeting you there.

#### ICFP + Haskell Symposium + HIW + CUFP (3-9 September 2017)

The annual International Conference on Functional Programming will take place in Oxford this year. A full week of events focused on functional programming, including the two-day Haskell Symposium and the Haskell Implementors Workshop. There’s also the Commercial Users of Functional Programming conference which features several tutorials on various programming languages and techniques.

We will certainly be there and participate actively.

#### Haskell eXchange (12-13 October 2017 + 14-15 October 2017)

The two-day Haskell developer conference organized by us and Skills Matter in London is back for another year. We are currently looking for talk proposals for this conference, so if you have anything you would like to present, please submit! Registration is also open already, and tickets are cheaper the earlier you book.

There’s also going to be a two-day hackathon / unconference on the weekend after the Haskell eXchange.

If you would be interested in sponsoring the Haskell eXchange, please let us know.

# Hackage reliability via mirroring

Friday, 30 September 2016, by Duncan Coutts.

Filed under community.

(Read more …)TL;DR:Hackage now has multiple secure mirrors which can be used fully automatically by clients such as cabal.

# Sharing, Space Leaks, and Conduit and friends

Thursday, 29 September 2016, by Edsko de Vries.

Filed under coding.

(Read more …)TL;DR:Sharing conduit values leads to space leaks. Make sure that conduits are completely reconstructed on every call to`runConduit`

; this implies we have to be careful not to create any (potentially large) conduit CAFs (skip to the final section “Avoiding space leaks” for some details on how to do this). Similar considerations apply to other streaming libraries and indeed any Haskell code that uses lazy data structures to drive computation.

# Haskell eXchange, Hackathon, and Courses

Thursday, 01 September 2016, by Andres Löh.

Filed under community, well-typed, training.

In October 2016, we are co-organizing various events in London. Now is the time to register for:

the Haskell eXchange, a two-day three-track conference with a large number of Haskell-related talks and workshops on a wide variety of topics, including keynotes by Simon Peyton Jones, Don Stewart, Conor McBride and Graham Hutton;

the Haskell eXchange Hackathon, a two-day event for everyone who wants to get involved coding on projects related to the Haskell infrastructure, such as Hackage and Cabal;

our Haskell courses, including a two-day introductory course, a one-day course on type-level programming in GHC, and a two-day course on lazy evaluation and performance.

# Announcing MuniHac

Friday, 15 July 2016, by Andres Löh.

Filed under community, well-typed, training.

We are happy to announce

## MuniHac

This Hackathon is intended for everyone who is interested to write programs in Haskell, whether beginner or expert, whether hobbyist or professional.

In the tradition of other Haskell Hackathons such as ZuriHac, HacBerlin, UHac and many more, the plan is to bring together up to a hundred of Haskell enthusiasts to work together on any Haskell-related projects they like, to share experiences, and to learn new things.

This Hackathon is organized by TNG Technology Consulting GmbH and Well-Typed LLP.

Attendance is free of charge, but there is a limited capacity, so you must register!

We are going to set up a mentor program and special events for Haskell newcomers. So if you are a Haskell beginner, you are very much welcome! And if you’re an expert, we’d appreciate if you’d be willing to spend some of your time during the Hackathon mentoring newcomers. We will ask you about this during the registration process.

We’re also planning to have a number of keynote talks at the Hackathon. We’re going to announce these soon.

We hope to see you in Munich!

# Haskell development jobs with Well-Typed

Tuesday, 08 March 2016, by Andres Löh, Duncan Coutts, Adam Gundry.

Filed under well-typed.

**tl;dr** *If you’d like a job with us, send your application as soon as possible.*

We are looking for several (probably two) Haskell experts to join our team at Well-Typed. This is a great opportunity for someone who is passionate about Haskell and who is keen to improve and promote Haskell in a professional context.

### About Well-Typed

We are a team of top notch Haskell experts. Founded in 2008, we were the first company dedicated to promoting the mainstream commercial use of Haskell. To achieve this aim, we help companies that are using or moving to Haskell by providing a range of services including consulting, development, training, and support and improvement of the Haskell development tools. We work with a wide range of clients, from tiny startups to well-known multinationals. We have established a track record of technical excellence and satisfied customers.

Our company has a strong engineering culture. All our managers and decision makers are themselves Haskell developers. Most of us have an academic background and we are not afraid to apply proper computer science to customers’ problems, particularly the fruits of FP and PL research.

We are a self-funded company so we are not beholden to external investors and can concentrate on the interests of our clients, our staff and the Haskell community.

### About the jobs

One of the roles is for a specific project with one of our clients, and requires work on-site in London. The other role is more general and not tied to a single specific project or task, and allows remote work.

Please indicate in your application whether on-site work in London is an option for you.

In general, work for Well-Typed could cover any of the projects and activities that we are involved in as a company. The work may involve:

working on GHC, libraries and tools;

Haskell application development;

working directly with clients to solve their problems;

teaching Haskell and developing training materials.

We try wherever possible to arrange tasks within our team to suit peoples’ preferences and to rotate to provide variety and interest.

Well-Typed has a variety of clients. For some we do proprietary Haskell development and consulting. For others, much of the work involves open-source development and cooperating with the rest of the Haskell community: the commercial, open-source and academic users.

Our ideal candidate has excellent knowledge of Haskell, whether from industry, academia or personal interest. Familiarity with other languages, low-level programming and good software engineering practices are also useful. Good organisation and ability to manage your own time and reliably meet deadlines is important. You should also have good communication skills. Being interested or having experience in teaching Haskell (or other technical topics) is a bonus. Experience of consulting or running a business is also a bonus. You are likely to have a bachelor’s degree or higher in computer science or a related field, although this isn’t a requirement.

### Offer details

The offer is initially for one year full time, with the intention of a long term arrangement. For the remote role, living in England is not required. For the on-site role, you have to be allowed to work in England. We may be able to offer either employment or sub-contracting, depending on the jurisdiction in which you live.

If you are interested, please apply via info@well-typed.com. Tell us why you are interested and why you would be a good fit for Well-Typed, and attach your CV. Please indicate whether the on-site work in London is an option for you. Please also indicate how soon you might be able to start.

We are more than happy to answer informal enquiries. Contact Duncan Coutts (duncan@well-typed.com, dcoutts on IRC), Adam Gundry (adam@well-typed.com, agundry on IRC) or Andres Löh (andres@well-typed.com, kosmikus on IRC) for further information.

We will consider applications as soon as we receive them, and will try to fill the positions as soon as possible. In any case, please try to get your application to us by March 27, 2016.

# Efficient Amortised and Real-Time Queues in Haskell

Friday, 15 January 2016, by Edsko de Vries.

Filed under coding.

A queue is a datastructure that provides efficient—O(1)—operations to remove an element from the *front* of the queue and to insert an element at the *rear* of the queue. In this blog post we will discuss how we can take advantage of laziness to implement such queues in Haskell, both with amortised and with worst-case O(1) bounds.

The results in this blog post are not new, and can be found in Chris Okasaki’s book “Purely Functional Data Structures”. However, the implementation and presentation here is different from Okasaki’s. In particular, the technique we use for real-time datastructures is more explicit and should scale to datastructures other than queues more easily than Okasaki’s.

(Read more …)