Dynamic Witnesses for Static Type Errors (or, Ill-Typed Programs ...

0 downloads 172 Views 884KB Size Report
lambda. 2.2 Visualizing Witnesses. We have described how to reliably find witnesses to type errors in OCAML, but this do
Dynamic Witnesses for Static Type Errors ∗ (or, Ill-Typed Programs Usually Go Wrong) Eric L. Seidel

Ranjit Jhala

Westley Weimer

UC San Diego, USA

University of Virginia, USA

{eseidel,jhala}@cs.ucsd.edu

[email protected]

Abstract Static type errors are a common stumbling block for newcomers to typed functional languages. We present a dynamic approach to explaining type errors by generating counterexample witness inputs that illustrate how an ill-typed program goes wrong. First, given an ill-typed function, we symbolically execute the body to synthesize witness values that make the program go wrong. We prove that our procedure synthesizes general witnesses in that if a witness is found, then for all inhabited input types, there exist values that can make the function go wrong. Second, we show how to extend the above procedure to produce a reduction graph that can be used to interactively visualize and debug witness executions. Third, we evaluate the coverage of our approach on two data sets comprising over 4,500 ill-typed student programs. Our technique is able to generate witnesses for 88% of the programs, and our reduction graph yields small counterexamples for 81% of the witnesses. Finally, we evaluate whether our witnesses help students understand and fix type errors, and find that students presented with our witnesses show a greater understanding of type errors than those presented with a standard error message.

1 2 3 4 5

Categories and Subject Descriptors D.3.2 [Programming Languages]: Language Classifications—Applicative (functional) languages; D.3.4 [Programming Languages]: Processors—Debuggers; F.3.3 [Logics and Meanings of Programs]: Studies of Program Constructs—Type structure

let rec fac n = if n