In this assignment you will implement Hindley-Milner type inference, which represents the current “best practice” for flexible static typing. The assignment has two purposes:
git clone linux.cs.tufts.edu:/comp/105/book-codeThe code you need is in bare/uml/ml.sml.
T. Test cases for type inference.
Submit three test cases for type inference. At least two of these test
cases should be for terms that fail to type check.
Each test case should be a definition written in µML.
Put your test cases in a file ttest.uml.
Here is a sample ttest.uml file:
(val weird (lambda (x y z) (cons x y z))) (+ 1 #t) (lambda (x) (cons x x))Naturally, you will supply your own test cases.
For the remaining exercises, here are some additional remarks and suggestions.
This is one assignment where it pays to run a lot of tests, of both good and bad definitions. The most effective test of your algorithm is not that it properly assign types to correct terms, but that it reject ill-typed terms.
The real test of your interpreter is that it should reject incorrect definitions. You should prepare a dozen or so definitions that should not type check, and make sure they don't. For example:
(val bad (lambda (x) (cons x x))) (val bad (lambda (x) (cdr (pair x x))))Pick your toughest three test cases to submit for Exercise T.
NIL
and one case for PAIR
.
There are also some common assumptions which are mistaken:
begin
is never empty.
turnin -c cs456 -p ml-inf README ttest.uml ml.sml
Your solutions are going to be evaluated automatically. We must be able to compile your solution in Moscow ML by typing, e.g.,
mosmlc ml.sml
If there are errors or warnings in this step, your work will earn
No Credit for functional correctness.
We will focus most of our evaluation on your constraint solving and
type inference.
Exemplary | Satisfactory | Must improve | |
---|---|---|---|
Form | • The code has no offside violations. • Or, the code has just a couple of minor offside violations. • Indentation is consistent everywhere. • The submission has no bracket faults. • The submission has a few minor bracket faults. • Or, the submission has no bracketed names, but a few bracketed conditions or other faults. |
• The code has several offside violations, but course staff can follow what's going on without difficulty. • In one or two places, code is not indented in the same way as structurally similar code elsewhere. • The submission has some redundant parentheses around function applications that are under infix operators (not checked by the bracketing tool) • Or, the submission contains a handful of bracketing faults. • Or, the submission contains more than a handful of bracketing faults, but just a few bracketed names or conditions. |
• Offside violations make it hard for course staff to follow the code. • The code is not indented consistently. • The submission contains more than a handful of parenthesized names as in • The submission contains more than a handful of parenthesized |
Names | • Type variables have names beginning with |
• Types, type variables, constraints, and substitutions mostly respect conventions, but there are some names like |
• Some names misuse standard conventions; for example, in some places, a type variable might have a name beginning with |
Structure | • • • • Type inference for list literals has no redundant case analysis. • Type inference for expressions has no redundant case analysis. • In the code for type inference, course staff see how each part of the code is necessary to implement the algorithm correctly. • Wherever possible appropriate, submission uses |
• • • • • Type inference for list literals has one redundant case analysis. • Type inference for expressions has one redundant case analysis. • In some parts of the code for type inference, course staff see some code that they believe is more complex than is required by the typing rules. • Submission sometimes uses a fold where |
• • • Course staff cannot identify the role of helper functions; course staff can't identify contracts and can't infer contracts from names. • Type inference for list literals has more than one redundant case analysis. • Type inference for expressions has more than one redundant case analysis. • Course staff believe that the code is significantly more complex than what is required to implement the typing rules. • Submission includes one or more recursive functions that could have been written without recursion by using |