<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Solved and Open Problems in Type Error Diagnosis ?</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Jurriaan Hage</string-name>
          <email>j.hage@uu.nl</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Dept. of Information and Computing Sciences, Utrecht University</institution>
          <country country="NL">The Netherlands</country>
        </aff>
      </contrib-group>
      <fpage>62</fpage>
      <lpage>74</lpage>
      <abstract>
        <p>The purpose of this paper is to present a number of directions for future research in type error diagnosis. To be able to position these open problems, we rst discuss accomplishments in the eld without trying to be exhaustive.</p>
      </abstract>
      <kwd-group>
        <kwd>programming languages</kwd>
        <kwd>type error diagnosis</kwd>
        <kwd>functional programming paradigm</kwd>
        <kwd>open problems</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>Jurriaan Hage</p>
    </sec>
    <sec id="sec-2">
      <title>Introduction</title>
      <p>
        Individual lives as well as entire economies now depend on the reliability of
software. However, it is a major challenge to ensure that software is safe and
correct: it is estimated that programmers make, on average, 15 to 50 errors
per 1,000 lines of code [
        <xref ref-type="bibr" rid="ref35">35</xref>
        ], and these errors may lead to bugs, system failures,
security leaks, or even major catastrophes [
        <xref ref-type="bibr" rid="ref15 ref18 ref45 ref52 ref8">8, 15, 18, 45, 52</xref>
        ]. There are many
approaches to increase the reliability of software, ranging from manual code
inspection, via testing, to formal methods such as program veri cation, model
checking, and static typing. In this paper we only consider the light-weight formal
method of static typing.
      </p>
      <p>
        A static type-based approach integrates the veri cation of program properties
tightly with the program source. A program type is e ectively an automatically
and independently veri able certi cate that the stated property holds for a
speci c program fragment, module, or the complete program. These properties can
then be veri ed e ciently and e ectively by a compiler using mathematically
veri ed techniques, thereby improving the quality of software during its
production. Compared to other formal methods it is lightweight, and can therefore be
easily embedded into the software development loop. It is not surprising then
that most of the recent developments in industrial cutting-edge programming
languages draw heavily on types, e.g. Facebook's Hack [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ], Google's Go [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ], and
Mozilla's Rust [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ].
      </p>
      <p>
        The guarantees that types provide are typically not complete: the type of the
sorting function may guarantee that it returns a list, but not that the output
? Copyright c 2020 for this paper by its authors. Use permitted under Creative
Commons License Attribution 4.0 International (CC BY 4.0).
list is indeed sorted, or even that the input and output list are of the same
length. What can and cannot be veri ed depends on the expressiveness of the
type system that is part of the programming language de nition. Along this
dimension dependently-typed languages such as Agda [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ], Coq [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ] and Idris [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]
are considered to be the most expressive.
      </p>
      <p>Expressiveness and power do come at a price. It seems that the more
advanced type level features a language and its implementations support, the more
incomprehensible type error messages become, decreasing programmer
productivity and hindering the uptake of these features, features that were intended by
their designers to increase the number and precision of the guarantees that the
compiler can provide for a given application. Martin Odersky, in private
communication, called this problem the \type wall", and not addressing the issue
may well lead to developers turning their backs on statically typed languages,
and ocking to dynamic languages instead.</p>
      <p>In this paper, we want to propose a number of challenges within the eld of
type error diagnosis, embedding these challenges in discussions of the state of
the art. We do not try to be comprehensive; there seems to be enough interesting
work to be done. Note that the earlier sections consider concrete challenges in
rather speci c contexts, while later sections are more speculative.</p>
      <p>Before we go on: in the literature, some researchers explicitly distinguish
between two theoretical extremes: type checking (all types are given and we
only need to check these) and type inference (no types are given, the process
discovers all types on the go). In practical settings, the distinction is less extreme.
Certainly, we do not expect in any programming language that the programmer
annotates every single part of his/her program with types, so there will always be
some amount of inference (note that inference goes beyond choosing the types of
identi ers and also includes coming up with inferred types for all expressions and
statements in the program). The extent to which types can be omitted depends
intimately on the language and its implementation. Below, we do not distinguish
between the two, and use type inferencing to refer to this combined process.
2</p>
    </sec>
    <sec id="sec-3">
      <title>Type error diagnosis for functional languages</title>
      <p>
        Although it is hard to say why, languages in the functional programming paradigm
have received much more attention when it comes to type error diagnosis.
Possibly this is because it is much easier to make mistakes when higher-order functions
and parametric polymorphism are used on a daily basis. Some researchers in the
eld have published a manifest that details what properties one may want type
error messages to have [
        <xref ref-type="bibr" rid="ref58">58</xref>
        ].
      </p>
      <p>
        The earliest work on type error diagnosis aimed at improving the now classic
algorithm W [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ]. Researchers quickly discovered that any implementation that
solves uni cations during the traversal of the abstract syntax tree was bound to
have some form of bias, derived from the particular traversal. For example, the
folklore algorithm M was known to discover mistakes \sooner", that is, having
looked at fewer uni cations [
        <xref ref-type="bibr" rid="ref32">32</xref>
        ]. From an e ciency point of view, this may well
be good, but not for type error diagnosis. The reason is that when you look at the
type error diagnosis that can be provided, comparing algorithms M and W, the
latter can provide more context about the error, having seen more uni cations.
      </p>
      <p>
        As it happens, when all uni cations are equality constraints, the order of
solving is irrelevant, and we are in fact free to choose the order in which
constraints are solved. This is why algorithm G was de ned [
        <xref ref-type="bibr" rid="ref32">32</xref>
        ], providing external
control of the various orderings it supports. However, whatever the chosen
ordering, there will always be programs for which that ordering leads to a type
error message that has some bias. If only the solving order could in some ways
be dictated by the program itself.
      </p>
      <p>
        A di erent way of implementing the type inference process was proposed
by various authors [
        <xref ref-type="bibr" rid="ref27 ref28 ref43">27, 28, 43</xref>
        ]: as a constraint solving problem. This implies
that type inference consists of an abstract syntax tree traversal that maps the
program to some kind of constraint program (some use a constraint set, others
a constraint tree, again others a single constraint in a more elaborate constraint
language), which is later \interpreted" by a solver. If the solver succeeds, it
returns a substitution as evidence that it did, and otherwise it typically returns
a (set of) constraint(s), the solver deems responsible for the error. This separation
of concerns has been followed by many others and may now be considered the
standard approach 1. In the case of the Helium compiler [
        <xref ref-type="bibr" rid="ref21 ref22 ref25 ref28">21,22,25,28</xref>
        ], constraints
were used to decouple the type system from the solving order by mapping the
program to a constraint tree. That constraint tree could then be attened into a
list of constraints that were then fed to a solver. The bene ts were that when you
were unsatis ed with the type error message, you could (1) choose a di erent
ordering, and/or (2) choose a di erent solver. Various orders were prede ned
(including the orders of W and M) as well as various solvers. Typically, the
compiler uses a fast greedy solver for equality constraints as long as no error
occurs, but when a type error does occur, it starts a more complicated solving
process for the binding group where the type inconsistency arises. Such a binding
group is typically small compared to the size of the program, and using a more
complicated solver did not harm performance very much. In the case of Helium,
heuristics were developed to provide tailormade error messages. Helium does
this by means of a special datastructure called the type graph that can model
inconsistent constraint sets over which heuristics, looking for clues, have been
de ned [
        <xref ref-type="bibr" rid="ref21">21</xref>
        ]. For example, we may de ne a heuristic that depending on how a
literal is used, will provide a suggestion to use a di erent literal (examples taken
from [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ]).
      </p>
      <p>
        Given the following simple Haskell program
shout :: Show a ) a ! String
shout x = show x ++ 0!0
a recent version of Helium that is based on OutsideIn(X) [
        <xref ref-type="bibr" rid="ref55">55</xref>
        ] returns the
following message
1 The approach is also followed in implementations of realistic functional languages
such as Haskell [
        <xref ref-type="bibr" rid="ref20 ref3">3,20</xref>
        ], in the case of ghc, a constrain-based formulation also became
necessary to be able to deal with complexity of the language and its many variations.
(2,21): Type error in literal
expression : !
type : Char
expected type : String
probable fix : use a string literal instead
      </p>
      <p>In this case, the character literal should be a string literal since it is passed
to the (++) append operator that expects two lists (in Haskell lists of characters
are synonymous with strings).</p>
      <p>Another example is a heuristic that addresses faulty function applications by
suggesting to rearrange, insert or delete arguments. For example,
g :: [Int ] ! [Int ]
g xs = map (+1)
leads to the following type error message:
(2,8): Type error in application
expression : map (+ 1)
term : map
type : (Int -&gt; Int) -&gt; [Int]
does not match : (a -&gt; b ) -&gt; [a] -&gt; [b]
probable fix : insert a second argument
In this case, the type signature provides evidence that xs has type [Int ] and
that the type of the right-hand side should also be [ Int ]. Alas, map takes two
arguments, a function and a list, of which only one is provided. Therefore the type
of the right-hand side is [Int ] ! [Int ]. The heuristics detects this, and suggest
to add a second argument. It does not suggest to use xs for that argument,
however. Another way to x the issue is to remove xs as an argument, so writing
g = map (+1), but that would assume that xs is in fact the missing argument
to map. This is not unlikely in this particular case, but what if we add another
argument of type [Int ]?</p>
      <p>Other research approaches to type error diagnosis are possible too, however,
and it makes sense to discuss these at this point before we move on.</p>
      <p>
        The idea of type error slicing is inspired by that of program slicing [
        <xref ref-type="bibr" rid="ref57">57</xref>
        ]. In
program slicing, a slicing criterion is chosen, e.g., a variable used at a particular
line in the program, and then the (backward) slicing removes parts of the
program that cannot a ect the value of the variable at that program point. This
can be used to simplify programs while debugging. In the case of type error
slicing, programmers are provided with a program in which all the parts that
may contribute to a type error are highlighted; all other parts of the program
can be ignored when trying to resolve the inconsistency. Skalpel [
        <xref ref-type="bibr" rid="ref44">44</xref>
        ] (a
continuation of [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ]) implements type error slicers for Standard ML, supporting
advanced SML features like modules, which are somewhat related to GADTs in
Haskell. [
        <xref ref-type="bibr" rid="ref46">46</xref>
        ] adapts this idea to Haskell 98. The advantage of slicing is that the
actual location that causes the problem is highlighted, a disadvantage is that
many other locations are highlighted as well.
      </p>
      <p>
        Because type error slices can be large, many researchers prefer to blame one
or maybe a few constraints. For example, SHErrLoc [
        <xref ref-type="bibr" rid="ref59">59</xref>
        ] uses a graph-based
structure to encode the solving process, and then ranks the likeness of a
constraint being to blame using a Bayesian model. Their work considers type error
reporting for modern Haskell, including local hypotheses. [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] explains type
errors in Haskell programs using counter-factual typing, a version of variational
typing in which they keep track of the di erent types that an expression may
take. Although computationally somewhat costly, they can propagate type
inconsistencies from one binding group to another. [
        <xref ref-type="bibr" rid="ref38">38</xref>
        ] achieves something similar
by using an iterative deepening approach, in which the body of a binding is
inlined in its usage site if a con ict is detected between both. This allows the
inferencer to blame a location in the body of a (type correct) function if an
application of that function is type incorrect, at the expense of repeatedly calling
an SM solver with a growing set of constraints. These papers only address the
problem of error localization, and they can do little to explain what went wrong,
and how to x the error (by suggesting changes to the source code). This
information is available when type graphs are used. Work, beyond Helium, that uses
type graphs includes [
        <xref ref-type="bibr" rid="ref39">39</xref>
        ] and [
        <xref ref-type="bibr" rid="ref56">56</xref>
        ]. In the former type graphs were extended with
type classes and row types in the setting of Elm; in the latter heuristics were
de ned to explain con dentality errors. Type graphs were extended recently to
OutsideIn(X), so that existential types and GADTs could be modeled [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ].
      </p>
      <p>
        Some authors use a more complicated structure to diagnose type errors: [
        <xref ref-type="bibr" rid="ref40">40</xref>
        ]
and [
        <xref ref-type="bibr" rid="ref53">53</xref>
        ] expose the trace of the type checker to the programmer (for Scala
and OCaml, respectively), and [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ] de nes an explanation graph for
HindleyMiler type systems, which summarizes the information involved in type checking.
LiquidHaskell [
        <xref ref-type="bibr" rid="ref54">54</xref>
        ] uses SMT solving as part of type checking. In those cases,
reverse interpolation [
        <xref ref-type="bibr" rid="ref36">36</xref>
        ] can be used to derive a simpler explanation.
      </p>
      <p>
        From a didactic point of view, some researchers thought it a good idea to let
the type inference process, for a type incorrect program, to be best modeled as
an interaction between programmer and compiler. The most important research
line in this direction is that of Chameleon, although it seems work has been at
a standstill for quite some time [
        <xref ref-type="bibr" rid="ref50 ref51">50, 51</xref>
        ].
      </p>
      <p>
        For the case that we have no control over the compiler infrastructure, [
        <xref ref-type="bibr" rid="ref33">33</xref>
        ]
presents an approach in which the compiler is iteratively queried for the
welltypedness of modi ed versions of the programmer input, which are then ranked
to present a solution to the type error. A big advantage of this approach is it
treats the type inference process as a black box.
      </p>
      <p>Now that the reader should have some idea of the work that has been done
in this area, we can now list some challenges within this (narrow) eld, including
some re ections on the problems at hand.</p>
      <p>
        Open Problem: advanced type level features and their interactions
The Haskell implementation ghc contains many type system features that have
never been considered from the type error diagnosis perspective. The only
exception seems to be GADTs and existential types [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ]. Although others have made
implementations that can work in the presence of some of Haskell's advanced
features, as far as this author knows, the benchmarks they employed did not
include any programs that used such features. It has not yet been established
that good solutions to error diagnosis for these advanced features exist, and even
more so what happens when a given programmer selects a particular set of
extensions to use within a single application. Does this change the error diagnosis
at all? Does this depend strongly on the particular combination of extensions?
This is a wide open area with many unanswered questions.
      </p>
      <p>
        Open Problem: proof assistance In dependently typed languages, such as
Agda, Idris, and Coq, type correctness corresponds to functional correctness.
These languages are usually not used to implement applications, but as proof
tools. This means that \error diagnosis" can take on two forms: the usual type
error messages we also see come up in everyday functional programming (e.g.,
you pass the arguments to this function in the wrong order), and the problem
of proof assistance (e.g., you need to strenghten this lemma for the theorem to
go through). In the former case we can look at research on plain functional
languages, in the latter case we nd a pretty completely open eld of investigation.
Only a few works have addressed the problem of error diagnosis at all in this
setting [
        <xref ref-type="bibr" rid="ref14 ref17">14, 17</xref>
        ].
      </p>
      <p>Open Problem: error explanation and repair As the above historical
overview suggests, most work in this area is on error localization. The advantage
of work in that direction is that it is relatively easily to validate: the output is
a simple location, not the way a type error message is formulated.</p>
      <p>But localization also means we can only point at a location, and not diagnose
the mistake, or make suggestions on how to x the problem. This does not mean
localization is altogether useless, and in fact such localizers can also be used
in a setting that employs heuristics. Consider a compiler that has any number
of implementations of localizing errors. In addition, we implement a heuristic
approach in which many di erent heuristics are asked to come up with both a
location and a diagnosis or x based on that location. A problem when using
heuristics is you may have multiple heuristics, each choosing a particular location
and explanation. Which heuristic is the right one? Well, maybe that is simply
the one that agrees best with the localizers. In other words, the localizers provide
more con dence when choosing the right message (or, if we can have multiple
messages, which one to put at the top).</p>
      <p>
        Open Problem: benchmarks A major problem in all type error diagnosis
endeavors is the absence of suitable benchmarks. The author of this paper has
collected a \large" number (around 50,000) of programs written by students,
that have also been used by others. However, these were collected from second
year undergraduate students and they do not employ any advanced features, just
plain old Haskell 98. There are not many places where students, in su ciently
large numbers, program using the more advanced features we now will want to
be considering, and for publishing about research on these features, benchmarks
are indispensable.
Open Problem: aspects of domain-speci c type error diagnosis There
is a strand of work by the author that addresses the problem of type error
diagnosis for embedded domain-speci c languages, again within the context of
Haskell, and mostly within Helium [
        <xref ref-type="bibr" rid="ref24 ref26 ref48">24,26,48</xref>
        ]; a PhD has been published that has
similar aims but works on Scala [
        <xref ref-type="bibr" rid="ref41">41</xref>
        ]. In these works, domain-speci c type error
diagnosis is implemented as an external DSL that uses type error speci cations
to control the solving order and the delivered diagnosis. The speci cations are
automatically checked for soundness with respect to type system.
      </p>
      <p>
        Some of the ideas of these works have also been implemented in ghc [
        <xref ref-type="bibr" rid="ref47">47</xref>
        ].
In this case, we are limited by what can be grafted onto ghc's type inference
engine. But this approach also has signi cant advantages: changes to the
compiler were minimal, and soundness of the type rules is veri ed by the compiler
as part of its type system. Moreover, since the rules are written using the type
level programming facilities of Haskell, the methods of abstraction that Haskell
provides there are all available to us. A disadvantage is that the diagnosis of type
level programming itself is not a solved problem (see earlier), and the control we
can exert is less than reported in other work. It is unclear at this time how far
the idea can be taken without having to completely redesign the type inference
engine of ghc.
      </p>
      <p>
        In a setting with external DSLs, it may well be possible to approach the
problem of type error diagnosis as we do in de ning the intrinsic type system of
a general purpose language. In [
        <xref ref-type="bibr" rid="ref49">49</xref>
        ], an architecture for such an implementation
is de ned and motivated. The full architecture is not something that has been
exhaustively tested, but generally it does seem to be the case that decoupling the
speci cation of the type system in terms of constraints from the solving process
is a good idea for two reasons: it simpli es the type system implementation, and
it simpli es diagnosis.
3
      </p>
    </sec>
    <sec id="sec-4">
      <title>Beyond type error diagnosis in functional languages</title>
      <p>
        The type system that comes with statically typed languages as part of their
de nition is not the only one of its kind. One can implement various extensions
to such type systems. Typical examples include dimension analysis [
        <xref ref-type="bibr" rid="ref29 ref30">29, 30</xref>
        ], type
based security analysis [
        <xref ref-type="bibr" rid="ref42 ref56">42, 56</xref>
        ] and pattern match analysis [
        <xref ref-type="bibr" rid="ref31 ref37">31, 37</xref>
        ]. In the latter
case, we want the compiler to verify that pattern match failures cannot crash the
program, in dimension analysis type are re ned by having \ oats that represent
meters" and \ oats that represent kilograms" and preventing the programmer
from, say, adding two such oats together. Such types have been implemented
in F#. Since we now want to reject more programs, the problem of type error
diagnosis will come up sooner or later, although it will depend somewhat on the
richness of the dimension types.
      </p>
      <p>
        In the case of security type systems, the type system prevents values of high
con dentiality to end up in variables of low con dentiality. As far as this author
knows, this is the only validating analysis for which type error diagnosis has
been considered [
        <xref ref-type="bibr" rid="ref56">56</xref>
        ].
      </p>
      <p>
        Much more speculatively, optimising analyses for functional languages are
often designed as annotated type systems [
        <xref ref-type="bibr" rid="ref34">34</xref>
        ]. Examples are too numerous to
mention, and include control- ow analysis, sharing analysis, escape analysis,
binding-time analysis. In such a system, annotations, that describe additional
properties of the type, are attached to types, and the type system implementation
will try to infer the best properties. The above validating analyses actually use
the same approach.
      </p>
      <p>The di erence is that an optimising analysis typically will accept exactly all
programs accepted by the underlying intrinsic type system. At this point, error
diagnosis does not play a role. But what if we want to allow the programmer
to express certain properties about his/her programs to communicate to the
programmer that certain optimisations should be made, and to have the compiler
verify that these properties make sense? Then, if the analysis fails, we may want
the compiler to explain to the programmer why this is not the case. This is
currently a wide open eld of investigation.
4</p>
    </sec>
    <sec id="sec-5">
      <title>Type error diagnosis, elsewhere</title>
      <p>
        What is most striking about type error diagnosis beyond the functional
programming languages is that there is almost nothing to report on. A few papers
exist that deal with generic method invocations in Java [
        <xref ref-type="bibr" rid="ref10 ref9">9, 10</xref>
        ], and a PhD thesis
within the context of Scala [
        <xref ref-type="bibr" rid="ref41">41</xref>
        ] that tries to achieve something like the
specialized type rules of Helium [
        <xref ref-type="bibr" rid="ref26">26</xref>
        ], but with much more control over the process by
providing the ability to inspect type inference traces. This increased control does
come at the price of more complexity.
      </p>
      <p>Type error diagnosis in this setting may well be harder, because the type
systems themselves typically combine higher-order functions, parametric
polymorphism and some form of subtyping. Therefore, type inference is
algorithmically already quite hard, and diagnosis will typically not make it any easier.
Another aspect is that multi-paradigm languages like Scala tend to draw people
from di erent paradigms, and their needs are likely to be di erent. For example,
a Haskell programmer may be surprised that types do not propagate as easily
under local type inference in Scala, while Java programmers will not always be
that familiar with type variables. Another complication is that a language like
Java started from an object-oriented core and had various extensions added to
it while having to remain backwards compatible. These grafts on top the
language tend to be quite ad hoc, complicating type error diagnosis. To be fair,
Haskell seems to have a similar problem as compared to full dependently typed
languages.
5</p>
    </sec>
    <sec id="sec-6">
      <title>What about SLE?</title>
      <p>The talk that led to this paper was presented at OOPSLE, which may lead to
the question: how is this topic relevant to SLE? Clearly, the problem is related
to the implementation of programming languages.</p>
      <p>
        In [
        <xref ref-type="bibr" rid="ref49">49</xref>
        ], an architecture is presented for a (Haskell) compiler that has type
error diagnosis as part of its design, not as an afterthought. Although it remains
to be seen whether the architecture is su ciently rich to be used in all situations,
and whether its features are relevant in every setting, it does tell us that things
aren't so simple as they may seem at rst. The relevance to SLE is that the work
tells us how to organize/structure a compiler to deal with various kinds of tasks
in type error diagnosis.
5.1
      </p>
      <sec id="sec-6-1">
        <title>Open Problem: analysis of compilation behavior</title>
        <p>
          A paper published at the rst SLE in Toulouse presented Neon [
          <xref ref-type="bibr" rid="ref23">23</xref>
          ], a library
for analyzing interactions with the compiler in the context of Helium. Helium
has built-in log facilities that could communicate compiled programs to a server.
Programs, collected during class hours while students were working on their
practical assignments, have been used by various authors in the eld. The rst
attempt with Helium to extract information from these compiles is hampered by
the fact that the programs were collected in vivo. For example, when someone
xes a mistake after 10 minutes is that because they went for co ee and checked
their phones for messages, or were they working on solving the problem? And
when after a type error the program compiles correctly is that because a teaching
assistant told them how to x it, did they x it themselves, or did they delete the
de nition altgother? And if we perform these experiments with students, either
in vivo or in vitro, does that tell us anything about professional developers?
Every answer seems to raise only more questions.
5.2
        </p>
      </sec>
      <sec id="sec-6-2">
        <title>Open Problem: everyone is di erent</title>
        <p>Type error diagnosis is to some extent a matter of taste. The thing is that
depending on where you come from, your level of expertise, your programming
style even, you will be wanting di erent things from error diagnosis. Maybe, all a
seasoned programmer needs is to get the approximate location of a mistake, but
what if these seasoned programmers start to uses type system extensions they
are not yet familiar with? Do their needs change over time, as they do become
more familiar? Everyone seems to have di erent needs, and at this time we are
not yet at the level that we can satisfy the needs themselves. The problem to
decide what someone needs and when is likely to be even harder. Some process in
which programming becomes an interaction with a compilation system, so that
that system can accrue some kind of operational pro le is likely to be essential
in that case.</p>
        <p>Of course, there is a eld in computer science that excels at modeling the
ad-hocness of human nature: machine learning. But that will only work if we
have enough data to learn from. And as we explained above, that data is at this
time simply not available.</p>
      </sec>
    </sec>
    <sec id="sec-7">
      <title>Conclusion</title>
      <p>The conclusion is simple: there is still an immense amount of work to do.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          <article-title>1. The Agda programming language</article-title>
          . http://wiki.portal.chalmers.se/agda/ pmwiki.php, accessed:
          <fpage>2020</fpage>
          -03-20
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          <article-title>2. The Coq proof assistant</article-title>
          . https://coq.inria.fr/, accessed:
          <fpage>2020</fpage>
          -09-11
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3. The Glasgow Haskell Compiler, GHC. https://www.haskell.org/ghc/, accessed:
          <fpage>2020</fpage>
          -03-27
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          <article-title>4. The Go programming language</article-title>
          . https://golang.org/, accessed:
          <fpage>2020</fpage>
          -03-27
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          <article-title>5. The Hack programming language</article-title>
          . https://hacklang.org/, accessed:
          <fpage>2020</fpage>
          -03-27
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          <article-title>6. The Idris programming language</article-title>
          . https://www.idris-lang.org/, accessed:
          <fpage>2020</fpage>
          - 09-11
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          <article-title>7. The Rust programming language</article-title>
          . https://www.rust-lang.org/, accessed:
          <fpage>2020</fpage>
          - 03-27
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <article-title>When code can kill or care, tech</article-title>
          .
          <source>Quarterly (Economist)</source>
          ,
          <year>Q2</year>
          .2012
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9. el Boustani, N.,
          <string-name>
            <surname>Hage</surname>
          </string-name>
          , J.:
          <article-title>Corrective hints for type incorrect Generic Java programs</article-title>
          . In: Gallagher,
          <string-name>
            <surname>J.</surname>
          </string-name>
          , Voigtlander, J. (eds.)
          <source>Proceedings of the ACM SIGPLAN 2010 Workshop on Partial Evaluation and Program Manipulation (PEPM '10)</source>
          . pp.
          <volume>5</volume>
          {
          <fpage>14</fpage>
          . ACM Press (
          <year>2010</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <surname>el Boustani</surname>
          </string-name>
          , N.,
          <string-name>
            <surname>Hage</surname>
          </string-name>
          , J.:
          <article-title>Improving type error messages for generic java</article-title>
          .
          <source>HigherOrder and Symbolic Computation</source>
          <volume>24</volume>
          (
          <issue>1</issue>
          ),
          <volume>3</volume>
          {
          <fpage>39</fpage>
          (
          <year>2012</year>
          ), http://dx.doi.
          <source>org/10. 1007/s10990-011-9070-3</source>
          ,
          <fpage>10</fpage>
          .1007/s10990-011-9070-3
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <surname>Burgers</surname>
          </string-name>
          , J.:
          <article-title>Type error diagnosis for OutsideIn(X) in Helium (</article-title>
          <year>2019</year>
          ), https:// dspace.library.uu.nl/handle/1874/382127
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <surname>Chen</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Erwig</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          :
          <article-title>Counter-factual Typing for Debugging Type Errors</article-title>
          .
          <source>In: Proceedings of the 41st ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages</source>
          . pp.
          <volume>583</volume>
          {
          <fpage>594</fpage>
          . POPL '14,
          <string-name>
            <surname>ACM</surname>
          </string-name>
          , New York, NY, USA (
          <year>2014</year>
          ). https://doi.org/10.1145/2535838.2535863, http://doi.acm.
          <source>org/10</source>
          .1145/ 2535838.2535863
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <surname>Chitil</surname>
            ,
            <given-names>O.</given-names>
          </string-name>
          :
          <article-title>Compositional explanation of types and algorithmic debugging of type errors</article-title>
          .
          <source>In: Proceedings of the Sixth ACM SIGPLAN International Conference on Functional Programming</source>
          . pp.
          <volume>193</volume>
          {
          <fpage>204</fpage>
          . ICFP '01,
          <string-name>
            <surname>ACM</surname>
          </string-name>
          , New York, NY, USA (
          <year>2001</year>
          ). https://doi.org/10.1145/507635.507659, http://doi.acm.
          <source>org/ 10</source>
          .1145/507635.507659
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <surname>Christiansen</surname>
            ,
            <given-names>D.R.</given-names>
          </string-name>
          :
          <article-title>Re ect on your mistakes ! lightweight domain-speci c error messages (</article-title>
          <year>2014</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15.
          <string-name>
            <surname>Cipra</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          :
          <article-title>How number theory got the best of the pentium chip</article-title>
          , science,
          <volume>267</volume>
          :5195, pp.
          <fpage>170</fpage>
          -
          <lpage>175</lpage>
          ,
          <year>1995</year>
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          16.
          <string-name>
            <surname>Damas</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Milner</surname>
          </string-name>
          , R.:
          <article-title>Principal Type-schemes for Functional Programs</article-title>
          .
          <source>In: Proceedings of the 9th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages</source>
          . pp.
          <volume>207</volume>
          {
          <fpage>212</fpage>
          . POPL '82,
          <string-name>
            <surname>ACM</surname>
          </string-name>
          , New York, NY, USA (
          <year>1982</year>
          ). https://doi.org/10.1145/582153.582176, http://doi.acm.
          <source>org/10</source>
          . 1145/582153.582176
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          17.
          <string-name>
            <surname>Eremondi</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Swierstra</surname>
            ,
            <given-names>W.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hage</surname>
            ,
            <given-names>J.:</given-names>
          </string-name>
          <article-title>A framework for improving error messages in dependently-typed languages</article-title>
          .
          <source>Open Comput. Sci. 9</source>
          (
          <issue>1</issue>
          ),
          <volume>1</volume>
          {
          <fpage>32</fpage>
          (
          <year>2019</year>
          ). https://doi.org/10.1515/comp-2019-0001, https://doi.org/10.1515/ comp-2019
          <source>-0001</source>
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          18.
          <string-name>
            <surname>Gleick</surname>
            ,
            <given-names>J.:</given-names>
          </string-name>
          <article-title>A bug and a crash (</article-title>
          <year>1996</year>
          ), http://www.around.com/ariane.html
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          19.
          <string-name>
            <surname>Haack</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Wells</surname>
            ,
            <given-names>J.B.</given-names>
          </string-name>
          :
          <article-title>Type Error Slicing in Implicitly Typed Higherorder Languages</article-title>
          .
          <source>Sci. Comput</source>
          . Program.
          <volume>50</volume>
          (
          <issue>1-3</issue>
          ),
          <volume>189</volume>
          {224 (Mar
          <year>2004</year>
          ). https://doi.org/10.1016/j.scico.
          <year>2004</year>
          .
          <volume>01</volume>
          .004, http://dx.doi.org/10.1016/j. scico.
          <year>2004</year>
          .
          <volume>01</volume>
          .004
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          20.
          <string-name>
            <surname>Hage</surname>
            ,
            <given-names>J.:</given-names>
          </string-name>
          <article-title>The Helium homepage (</article-title>
          <year>2020</year>
          ), https://github.com/Helium4Haskell/
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          21.
          <string-name>
            <surname>Hage</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Heeren</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          :
          <article-title>Heuristics for type error discovery and recovery</article-title>
          . In: Horvath,
          <string-name>
            <given-names>Z.</given-names>
            ,
            <surname>Zsok</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            ,
            <surname>Butter</surname>
          </string-name>
          <string-name>
            <surname>eld</surname>
          </string-name>
          , A. (eds.)
          <source>Implementation of Functional Languages { IFL 2006</source>
          . vol.
          <volume>4449</volume>
          , pp.
          <volume>199</volume>
          {
          <fpage>216</fpage>
          . Springer Verlag, Heidelberg (
          <year>2007</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          22.
          <string-name>
            <surname>Hage</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Heeren</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          :
          <article-title>Strategies for solving constraints in type and e ect systems</article-title>
          .
          <source>Electronic Notes in Theoretical Computer Science</source>
          <volume>236</volume>
          ,
          <issue>163</issue>
          {
          <fpage>183</fpage>
          (
          <year>2009</year>
          ),
          <source>proceedings of the 3rd International Workshop on Views On Designing Complex Architectures (VODCA</source>
          <year>2008</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          23.
          <string-name>
            <surname>Hage</surname>
            , J., van Keeken,
            <given-names>P.</given-names>
          </string-name>
          :
          <article-title>Neon: A library for language usage analysis</article-title>
          .
          <source>In: Gasevic</source>
          ,
          <string-name>
            <given-names>D.</given-names>
            , Lammel, R.,
            <surname>Wyk</surname>
          </string-name>
          , E.V. (eds.)
          <source>Proceedings of the 1st Conference on Software Language Engineering (SLE '08). Lecture Notes in Computer Science</source>
          , vol.
          <volume>5452</volume>
          , pp.
          <volume>35</volume>
          {
          <fpage>53</fpage>
          . Springer (
          <year>2009</year>
          ), revised selected papers
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          24.
          <string-name>
            <surname>Heeren</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hage</surname>
          </string-name>
          , J.:
          <article-title>Type class directives</article-title>
          .
          <source>In: Seventh International Symposium on Practical Aspects of Declarative Languages</source>
          . pp.
          <volume>253</volume>
          {
          <fpage>267</fpage>
          . Springer Verlag, Berlin (
          <year>2005</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref25">
        <mixed-citation>
          25.
          <string-name>
            <surname>Heeren</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hage</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Swierstra</surname>
          </string-name>
          , S.D.:
          <article-title>Constraint based type inferencing in Helium</article-title>
          . In: Silaghi,
          <string-name>
            <given-names>M.C.</given-names>
            ,
            <surname>Zanker</surname>
          </string-name>
          , M. (eds.)
          <source>Workshop Proceedings of Immediate Applications of Constraint Programming</source>
          . pp.
          <volume>59</volume>
          {
          <fpage>80</fpage>
          .
          <string-name>
            <surname>Cork</surname>
          </string-name>
          (
          <year>September 2003</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref26">
        <mixed-citation>
          26.
          <string-name>
            <surname>Heeren</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hage</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Swierstra</surname>
          </string-name>
          , S.D.:
          <article-title>Scripting the type inference process</article-title>
          . In: Eighth International Conference on Functional Programming. pp.
          <volume>3</volume>
          {
          <fpage>13</fpage>
          . ACM Press, New York (
          <year>2003</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref27">
        <mixed-citation>
          27.
          <string-name>
            <surname>Heeren</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hage</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Swierstra</surname>
          </string-name>
          , S.D.:
          <article-title>Constraint based type inferencing in Helium</article-title>
          . In: Silaghi,
          <string-name>
            <given-names>M.C.</given-names>
            ,
            <surname>Zanker</surname>
          </string-name>
          , M. (eds.)
          <source>Workshop Proceedings of Immediate Applications of Constraint Programming</source>
          . pp.
          <volume>59</volume>
          {
          <fpage>80</fpage>
          .
          <string-name>
            <surname>Cork</surname>
          </string-name>
          (
          <year>September 2003</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref28">
        <mixed-citation>
          28.
          <string-name>
            <surname>Heeren</surname>
            ,
            <given-names>B.J.</given-names>
          </string-name>
          :
          <article-title>Top Quality Type Error Messages</article-title>
          .
          <source>Ph.D. thesis</source>
          , Universiteit Utrecht,
          <source>The Netherlands (Sep</source>
          <year>2005</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref29">
        <mixed-citation>
          29.
          <string-name>
            <surname>Kennedy</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>Types for units-of-measure: Theory and practice</article-title>
          . In: Horvath,
          <string-name>
            <given-names>Z.</given-names>
            ,
            <surname>Plasmeijer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            ,
            <surname>Zsok</surname>
          </string-name>
          , V. (eds.)
          <source>Central European Functional Programming School (CEFP), Lecture Notes in Computer Science</source>
          , vol.
          <volume>6299</volume>
          , pp.
          <volume>268</volume>
          {
          <fpage>305</fpage>
          . Springer Verlag (
          <year>2010</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref30">
        <mixed-citation>
          30.
          <string-name>
            <surname>Kennedy</surname>
            ,
            <given-names>A.J.</given-names>
          </string-name>
          :
          <source>Programming Languages and Dimensions. Ph.D. thesis</source>
          , Computer Laboratory, University of Cambridge (
          <year>1995</year>
          ), available as
          <source>Technical Report No. 391</source>
        </mixed-citation>
      </ref>
      <ref id="ref31">
        <mixed-citation>
          31.
          <string-name>
            <surname>Koot</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hage</surname>
          </string-name>
          , J.:
          <article-title>Type-based exception analysis for non-strict higher-order functional languages with imprecise exception semantics</article-title>
          .
          <source>In: Proceedings of the 2015 Workshop on Partial Evaluation and Program Manipulation</source>
          . pp.
          <volume>127</volume>
          {
          <fpage>138</fpage>
          . PEPM '15,
          <string-name>
            <surname>ACM</surname>
          </string-name>
          , New York, NY, USA (
          <year>2015</year>
          ). https://doi.org/10.1145/2678015.2682542, http://doi.acm.
          <source>org/10</source>
          .1145/2678015.2682542
        </mixed-citation>
      </ref>
      <ref id="ref32">
        <mixed-citation>
          32.
          <string-name>
            <surname>Lee</surname>
            ,
            <given-names>O.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Yi</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          :
          <article-title>A generalization of hybrid let-polymorphic type inference algorithms</article-title>
          .
          <source>In: Proceedings of the First Asian Workshop on Programming Languages and Systems</source>
          . pp.
          <volume>79</volume>
          {
          <fpage>88</fpage>
          . National university of Singapore,
          <source>Singapore (December</source>
          <year>2000</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref33">
        <mixed-citation>
          33.
          <string-name>
            <surname>Lerner</surname>
            ,
            <given-names>B.S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Flower</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Grossman</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Chambers</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          :
          <article-title>Searching for Type-error Messages</article-title>
          .
          <source>In: Proceedings of the 28th ACM SIGPLAN Conference on Programming Language Design and Implementation</source>
          . pp.
          <volume>425</volume>
          {
          <fpage>434</fpage>
          . PLDI '07,
          <string-name>
            <surname>ACM</surname>
          </string-name>
          , New York, NY, USA (
          <year>2007</year>
          ). https://doi.org/10.1145/1250734.1250783, http://doi. acm.
          <source>org/10</source>
          .1145/1250734.1250783
        </mixed-citation>
      </ref>
      <ref id="ref34">
        <mixed-citation>
          34.
          <string-name>
            <surname>Lucassen</surname>
            ,
            <given-names>J.M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Gi ord</surname>
          </string-name>
          , D.K.:
          <article-title>Polymorphic e ect systems</article-title>
          .
          <source>In: POPL '88: Proceedings of the 15th ACM SIGPLAN-SIGACT symposium on Principles of programming languages</source>
          . pp.
          <volume>47</volume>
          {
          <fpage>57</fpage>
          .
          <string-name>
            <surname>ACM</surname>
          </string-name>
          , New York, NY, USA (
          <year>1988</year>
          ). https://doi.org/http://doi.acm.
          <source>org/10</source>
          .1145/73560.73564
        </mixed-citation>
      </ref>
      <ref id="ref35">
        <mixed-citation>
          35.
          <string-name>
            <surname>McConnell</surname>
            ,
            <given-names>S.: Code</given-names>
          </string-name>
          <string-name>
            <surname>Complete</surname>
          </string-name>
          .
          <source>A Practical Handbook of Software Construction. 2nd edn</source>
          . (
          <year>2015</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref36">
        <mixed-citation>
          36.
          <string-name>
            <surname>McMillan</surname>
            ,
            <given-names>K.L.</given-names>
          </string-name>
          :
          <article-title>An interpolating theorem prover</article-title>
          . In: Jensen,
          <string-name>
            <given-names>K.</given-names>
            ,
            <surname>Podelski</surname>
          </string-name>
          ,
          <string-name>
            <surname>A</surname>
          </string-name>
          . (eds.)
          <article-title>Tools and Algorithms for the Construction and Analysis of Systems</article-title>
          . pp.
          <volume>16</volume>
          {
          <fpage>30</fpage>
          . Springer Berlin Heidelberg, Berlin, Heidelberg (
          <year>2004</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref37">
        <mixed-citation>
          37. Mitchell, N.,
          <string-name>
            <surname>Runciman</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          :
          <article-title>Not all patterns, but enough: an automatic veri er for partial but su cient pattern matching</article-title>
          .
          <source>In: Proceedings of the rst ACM SIGPLAN symposium on Haskell</source>
          . pp.
          <volume>49</volume>
          {
          <fpage>60</fpage>
          . Haskell '
          <volume>08</volume>
          ,
          <string-name>
            <surname>ACM</surname>
          </string-name>
          , New York, NY, USA (
          <year>2008</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref38">
        <mixed-citation>
          38.
          <string-name>
            <surname>Pavlinovic</surname>
            ,
            <given-names>Z.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>King</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Wies</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          :
          <article-title>Practical SMT-based Type Error Localization</article-title>
          .
          <source>In: Proceedings of the 20th ACM SIGPLAN International Conference on Functional Programming</source>
          . pp.
          <volume>412</volume>
          {
          <fpage>423</fpage>
          .
          <source>ICFP</source>
          <year>2015</year>
          , ACM, New York, NY, USA (
          <year>2015</year>
          ). https://doi.org/10.1145/2784731.2784765, http://doi.acm.
          <source>org/10</source>
          .1145/ 2784731.2784765
        </mixed-citation>
      </ref>
      <ref id="ref39">
        <mixed-citation>
          39.
          <string-name>
            <surname>Peijnenburg</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hage</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Serrano</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>Type directives and type graphs in elm</article-title>
          .
          <source>In: Proceedings of the 28th Symposium on the Implementation and Application of Functional Programming Languages, IFL</source>
          <year>2016</year>
          , Leuven, Belgium,
          <source>August 31 - September 2</source>
          ,
          <year>2016</year>
          . pp.
          <volume>2</volume>
          :
          <issue>1</issue>
          {2:
          <issue>12</issue>
          (
          <year>2016</year>
          ). https://doi.org/10.1145/3064899.3064907, https://doi.org/10.1145/3064899.3064907
        </mixed-citation>
      </ref>
      <ref id="ref40">
        <mixed-citation>
          40.
          <string-name>
            <surname>Plociniczak</surname>
          </string-name>
          , H.:
          <article-title>Scalad: An Interactive Type-level Debugger</article-title>
          .
          <source>In: Proceedings of the 4th Workshop on Scala</source>
          . pp.
          <volume>8</volume>
          :
          <issue>1</issue>
          {
          <issue>8</issue>
          :
          <fpage>4</fpage>
          . SCALA '13,
          <string-name>
            <surname>ACM</surname>
          </string-name>
          , New York, NY, USA (
          <year>2013</year>
          ). https://doi.org/10.1145/2489837.2489845, http://doi.acm.
          <source>org/10</source>
          .1145/ 2489837.2489845
        </mixed-citation>
      </ref>
      <ref id="ref41">
        <mixed-citation>
          41.
          <string-name>
            <surname>Plociniczak</surname>
          </string-name>
          , H.:
          <article-title>Decrypting Local Type Inference</article-title>
          .
          <source>Ph.D. thesis</source>
          , IC,
          <string-name>
            <surname>Lausanne</surname>
          </string-name>
          (
          <year>2016</year>
          ). https://doi.org/10.5075/ep -thesis-6741
        </mixed-citation>
      </ref>
      <ref id="ref42">
        <mixed-citation>
          42.
          <string-name>
            <surname>Pottier</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Simonet</surname>
            ,
            <given-names>V.</given-names>
          </string-name>
          :
          <article-title>Information ow inference for ml</article-title>
          .
          <source>In: POPL '02: Proceedings of the 29th ACM SIGPLAN-SIGACT symposium on Principles of programming languages</source>
          . pp.
          <volume>319</volume>
          {
          <fpage>330</fpage>
          .
          <string-name>
            <surname>ACM</surname>
          </string-name>
          , New York, NY, USA (
          <year>2002</year>
          ). https://doi.org/http://doi.acm.
          <source>org/10</source>
          .1145/503272.503302
        </mixed-citation>
      </ref>
      <ref id="ref43">
        <mixed-citation>
          43.
          <string-name>
            <surname>Pottier</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Remy</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          <article-title>: he Essence of ML Type Inference</article-title>
          . In: Pierce,
          <string-name>
            <surname>B.C.</surname>
          </string-name>
          (ed.)
          <source>Advanced Topics in Types and Programming Languages, chap. 10</source>
          , pp.
          <volume>389</volume>
          {
          <fpage>489</fpage>
          . MIT Press (
          <year>2005</year>
          ), http://cristal.inria.fr/attapl/
        </mixed-citation>
      </ref>
      <ref id="ref44">
        <mixed-citation>
          44.
          <string-name>
            <surname>Rahli</surname>
            ,
            <given-names>V.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Wells</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Pirie</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kamareddine</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          :
          <article-title>Skalpel: A constraint-based type error slicer for Standard ML</article-title>
          .
          <source>J. Symb. Comput</source>
          .
          <volume>80</volume>
          (
          <issue>P1</issue>
          ),
          <volume>164</volume>
          {208 (May
          <year>2017</year>
          ). https://doi.org/10.1016/j.jsc.
          <year>2016</year>
          .
          <volume>07</volume>
          .013, https://doi.org/10.1016/j. jsc.
          <year>2016</year>
          .
          <volume>07</volume>
          .013
        </mixed-citation>
      </ref>
      <ref id="ref45">
        <mixed-citation>
          45. Reuters: Toyota to recall
          <volume>436</volume>
          ,000 hybrids globally, feb.
          <source>2010</source>
        </mixed-citation>
      </ref>
      <ref id="ref46">
        <mixed-citation>
          46.
          <string-name>
            <surname>Schilling</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          :
          <article-title>Constraint-free Type Error Slicing</article-title>
          .
          <source>In: Proceedings of the 12th International Conference on Trends in Functional Programming</source>
          . pp.
          <volume>1</volume>
          {
          <fpage>16</fpage>
          . TFP'
          <volume>11</volume>
          , Springer-Verlag, Berlin, Heidelberg (
          <year>2012</year>
          ). https://doi.org/10.1007/978-3-
          <fpage>642</fpage>
          - 32037-8 1, http://dx.doi.org/10.1007/978-3-
          <fpage>642</fpage>
          -32037-
          <issue>8</issue>
          _
          <fpage>1</fpage>
        </mixed-citation>
      </ref>
      <ref id="ref47">
        <mixed-citation>
          47.
          <string-name>
            <surname>Serrano</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hage</surname>
          </string-name>
          , J.:
          <article-title>Type error customization in ghc: Controlling expressionlevel type errors by type-level programming</article-title>
          .
          <source>In: Proceedings of the 29th Symposium on the Implementation and Application of Functional Programming Languages</source>
          . pp.
          <volume>2</volume>
          :
          <issue>1</issue>
          {2:
          <fpage>15</fpage>
          .
          <source>IFL</source>
          <year>2017</year>
          , ACM, New York, NY, USA (
          <year>2017</year>
          ). https://doi.org/10.1145/3205368.3205370, http://doi.acm.
          <source>org/10</source>
          .1145/ 3205368.3205370
        </mixed-citation>
      </ref>
      <ref id="ref48">
        <mixed-citation>
          48.
          <string-name>
            <surname>Serrano</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hage</surname>
          </string-name>
          , J.:
          <article-title>Type error diagnosis for embedded dsls by two-stage specialized type rules</article-title>
          .
          <source>In: Programming Languages and Systems - 25th European Symposium on Programming, ESOP</source>
          <year>2016</year>
          ,
          <article-title>Proceedings</article-title>
          . pp.
          <volume>672</volume>
          {
          <issue>698</issue>
          (
          <year>2016</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref49">
        <mixed-citation>
          49.
          <string-name>
            <surname>Serrano</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hage</surname>
            ,
            <given-names>J.:</given-names>
          </string-name>
          <article-title>A compiler architecture for domain-speci c type error diagnosis</article-title>
          .
          <source>Open Comput. Sci. 9</source>
          (
          <issue>1</issue>
          ),
          <volume>33</volume>
          {
          <fpage>51</fpage>
          (
          <year>2019</year>
          ). https://doi.org/10.1515/comp-2019- 0002, https://doi.org/10.1515/comp-2019
          <source>-0002</source>
        </mixed-citation>
      </ref>
      <ref id="ref50">
        <mixed-citation>
          50.
          <string-name>
            <surname>Stuckey</surname>
            ,
            <given-names>P.J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Sulzmann</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Wazny</surname>
            ,
            <given-names>J.:</given-names>
          </string-name>
          <article-title>Interactive type debugging in Haskell</article-title>
          . pp.
          <volume>72</volume>
          {
          <fpage>83</fpage>
          . New York (
          <year>2003</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref51">
        <mixed-citation>
          51.
          <string-name>
            <surname>Stuckey</surname>
            ,
            <given-names>P.J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Sulzmann</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Wazny</surname>
          </string-name>
          , J.:
          <article-title>Improving type error diagnosis</article-title>
          . pp.
          <volume>80</volume>
          {
          <issue>91</issue>
          (
          <year>2004</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref52">
        <mixed-citation>
          52.
          <string-name>
            <surname>Technica</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>Airbus con rms software con guration error caused plane crash, 2015</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref53">
        <mixed-citation>
          53.
          <string-name>
            <surname>Tsushima</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Asai</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          :
          <article-title>An embedded type debugger</article-title>
          . In: Hinze,
          <string-name>
            <surname>R</surname>
          </string-name>
          . (ed.)
          <source>Implementation and Application of Functional Languages</source>
          . pp.
          <volume>190</volume>
          {
          <fpage>206</fpage>
          . Springer Berlin Heidelberg, Berlin, Heidelberg (
          <year>2013</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref54">
        <mixed-citation>
          54.
          <string-name>
            <surname>Vazou</surname>
            ,
            <given-names>N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Seidel</surname>
            ,
            <given-names>E.L.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Jhala</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Vytiniotis</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <given-names>Peyton</given-names>
            <surname>Jones</surname>
          </string-name>
          ,
          <string-name>
            <surname>S.</surname>
          </string-name>
          :
          <article-title>Re nement Types for Haskell</article-title>
          .
          <source>In: Proceedings of the 19th ACM SIGPLAN International Conference on Functional Programming</source>
          . pp.
          <volume>269</volume>
          {
          <fpage>282</fpage>
          . ICFP '14,
          <string-name>
            <surname>ACM</surname>
          </string-name>
          , New York, NY, USA (
          <year>2014</year>
          ). https://doi.org/10.1145/2628136.2628161, http://doi.acm.
          <source>org/10</source>
          . 1145/2628136.2628161
        </mixed-citation>
      </ref>
      <ref id="ref55">
        <mixed-citation>
          55.
          <string-name>
            <surname>Vytiniotis</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <given-names>Peyton</given-names>
            <surname>Jones</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            ,
            <surname>Schrijvers</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            ,
            <surname>Sulzmann</surname>
          </string-name>
          ,
          <string-name>
            <surname>M.:</surname>
          </string-name>
          <article-title>OutsideIn(x): Modular Type Inference with Local Assumptions</article-title>
          .
          <source>J. Funct. Program</source>
          .
          <volume>21</volume>
          (
          <issue>4- 5</issue>
          ),
          <volume>333</volume>
          {412 (Sep
          <year>2011</year>
          ). https://doi.org/10.1017/S0956796811000098, http://dx. doi.org/10.1017/S0956796811000098
        </mixed-citation>
      </ref>
      <ref id="ref56">
        <mixed-citation>
          56.
          <string-name>
            <surname>Weijers</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hage</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Holdermans</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          :
          <article-title>Security type error diagnosis for higherorder, polymorphic languages</article-title>
          .
          <source>Science of Computer Programming</source>
          <volume>95</volume>
          ,
          <issue>200</issue>
          {
          <fpage>218</fpage>
          (
          <year>2014</year>
          ). https://doi.org/https://doi.org/10.1016/j.scico.
          <year>2014</year>
          .
          <volume>03</volume>
          .011, http://www. sciencedirect.com/science/article/pii/S0167642314001518, selected
          <article-title>and extended papers from Partial Evaluation and Program Manipulation 2013</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref57">
        <mixed-citation>
          57.
          <string-name>
            <surname>Weiser</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          :
          <article-title>Program slicing</article-title>
          .
          <source>In: Proceedings of the 5th International Conference on Software Engineering</source>
          . pp.
          <volume>439</volume>
          {
          <fpage>449</fpage>
          . ICSE '81, IEEE Press (
          <year>1981</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref58">
        <mixed-citation>
          58.
          <string-name>
            <surname>Yang</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Michaelson</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Trinder</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          :
          <article-title>Explaining polymorphic types</article-title>
          .
          <source>The Computer Journal</source>
          <volume>45</volume>
          (
          <issue>4</issue>
          ),
          <volume>436</volume>
          {
          <fpage>452</fpage>
          (
          <year>2002</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref59">
        <mixed-citation>
          59.
          <string-name>
            <surname>Zhang</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Myers</surname>
            ,
            <given-names>A.C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Vytiniotis</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <given-names>Peyton</given-names>
            <surname>Jones</surname>
          </string-name>
          ,
          <string-name>
            <surname>S.</surname>
          </string-name>
          :
          <article-title>Diagnosing Type Errors with Class</article-title>
          .
          <source>In: Proceedings of the 36th ACM SIGPLAN Conference on Programming Language Design and Implementation</source>
          . pp.
          <volume>12</volume>
          {
          <fpage>21</fpage>
          . PLDI '15,
          <string-name>
            <surname>ACM</surname>
          </string-name>
          , New York, NY, USA (
          <year>2015</year>
          ). https://doi.org/10.1145/2737924.2738009, http: //doi.acm.
          <source>org/10</source>
          .1145/2737924.2738009
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>