Nullable Type Inference Michel Mauny

Benoît Vaugon

Unité d’Informatique et d’Ingénierie des Systèmes (U2IS) ENSTA-ParisTech France {michel.mauny,benoit.vaugon} ensta-paristech.fr

We present type inference algorithms for nullable types in ML-like programming languages. Starting with a simple system, presented as an algorithm, whose only interest is to introduce the formalism that we use, we replace unification by subtyping constraints and obtain a more interesting system. We state the usual properties for both systems. This is work in progress.

Now, the compilation of Some(expr) needs to generate a test, in order to use the special representation of Somen (None) when expr evaluates to None, and pattern-matching against Some/None also needs to be adjusted.

This paper does not aim at opposing nullable types to option types. Options, in the Hindley-Milner type discipline, offer not only type safety, but also precision by distinguish1 Nullable vs. option types ing Some(None) from None, but at the price of a memory allocation or a dynamic test for Some. On the other hand, nulImperative programming languages, such as C or Java deriva- lable types extend any classical type t into t?, to include NULL. tives, make abundant use of NULL either as a value for un- Such “nullable values” are easier to represent and compile known or invalid references, or as failure return values. Us- than options, but offer less precision since it makes no sense ing NULL is rather practical, since the if statement suffices for to extend further t?. Also, their static inference haven’t rechecking NULL-ity. Of course, the downside of having NULL as ceived much attention, so far. Indeed, although quite a few a possible value is that, without further support, it could acci- recent programming laguages statically check the safety of dentally be confused with a legal value, leading to execution NULL [3, 2, 11, 1], none of them really performs type infererrors [7]. ence in the ML sense, but rather local inference, propagatIn languages using the ML type discipline, the option type ing mandatory type annotations of function parameters inside the function bodies. type α option = None | Some of α injects regular values and the nullary data constructor None, into a single type that could be thought as a nullable type. The type system guarantees that options cannot be confused with regular values, and pattern-matching is used to check and extract regular values from options. In Haskell, the “maybe” data type is heavily used for representing successes and failures. The JaneStreet Core library [9] uses the option type to show possible failures in function types: it purposely avoids exceptions, because their non-appearance in OCaml types hides the partiality of functions. In OCaml, None and Some are automatically inserted by the compiler for dealing with optional arguments [5]. Using the option data type presents the disadvantage of allocating memory blocks for representing Some(_) values, which may refrain experienced programmers from heavily using options. Avoiding those memory allocations is not really difficult: if Some(v) is represented as v itself, that is, without allocating a block tagged as Some, we need a special representation for None, distinct from the representation of v, for any v. Of course, when v is None itself, it then becomes impossible to distinguish Some(None) from None. Therefore, None is not the only special case that needs a special treatment: the whole range of Somen (None) values, for n ≥ 0 needs a special representation such that Somei (None) cannot be confused with Some j (None) when i , j. For instance, unaligned addresses on 64-bits architectures, or a statically pre-allocated array of a sufficient size could do the job1 .

2

Nullable type inference

The purpose of this work is to study type inference of nullable types, by adding them as a feature in a small functional language. The language that we consider, given in figure 1, is a classical mini-ML, extended with NULL test and creation. Section 3 starts with a naïve approach, where the types τ

c e

::= ::= | |

() | true | f alse | 0 | 1 | 2 | . . . | + | . . . c | x | λx.e | e1 e2 | if e1 then e2 else e3 let x = e1 in e2 NULL | case e1 of NULL  e2 k x  e3

Figure 1: The language

(that are assigned to expressions e) are pairs (t, ν) of a usual type t and a “nullability” type information ν. A type (t, ?) corresponds to values that may be NULL, whereas (t, ∆) denotes values that cannot be NULL. Nullability variables are written δ. This system is mainly used to introduce the formalism that we use for writing our algorithms. Section 4 shows a translation algorithm that encode nullable values with polymorphic variants. Typing the translated programs with a unification-based mechanism suffers the same weakness as our naive type system. 1 Although polymorphic recursion theoretically allows for unbounded n Section 5 presents a more sophisticated typing mechanism, depth of Some (None) while this representation allows for representing only a finite number of n, this limitation should never be met in practice. where unification is replaced by subtyping constraints. Submitted to ML 2014

2

TC ONST Φ ` τ = T(c) B Φ0

TI NST (α) let α0 fresh

TI NST VAR Φ ` τ 0 = τ B Φ0

Φ, Γ ` c : τ B Φ0

Φ, Γ ⊕ x : τ0 ` x : τ B Φ0 TI NST (δ) let δ0 fresh

Φ, Γ ⊕ x : σ[αα0 ] ` x : τ B Φ0

Φ, Γ ⊕ x : ∀α.σ ` x : τ B Φ0

Φ, Γ ⊕ x : σ[δδ0 ] ` x : τ B Φ0

Φ, Γ ⊕ x : ∀δ.σ ` x : τ B Φ0 TL AMBDA let α1 , δ1 , α2 , δ2 fresh

Φ, Γ ⊕ x : (α1 , δ1 ) ` e : (α2 , δ2 ) B Φ0

Φ0 ` τ = (α1 , δ1 ) → (α2 , δ2 ) B Φ00

Φ, Γ ` λx.e : τ B Φ00 TA PP let α, δ fresh

Φ, Γ ` e1 : ((α, δ) → τ), ∆) B Φ0

Φ0 , Γ ` e2 : (α, δ) B Φ00

Φ, Γ ` e1 e2 : τ B Φ00 TL ET let α, δ fresh

Φ, Γ ` e1 : (α, δ) B Φ0

Φ0 , Γ ⊕ x : gen(Φ0 , Γ, (α, δ)) ` e2 : τ B Φ00

Φ, Γ ` let x = e1 in e2 : τ B Φ00 TI F T HEN E LSE Φ, Γ ` e1 : (bool, ∆) B Φ0

Φ0 , Γ ` e2 : τ B Φ00

Φ00 , Γ ` e3 : τ B Φ000

TN ULL let α fresh

Φ, Γ ` if e1 then e2 else e3 : τ B Φ000 TC ASE let δ fresh

Φ, Γ ` e1 : (t, ?) B Φ0

Φ ` τ = (α, ?) B Φ0

Φ, Γ ` NULL : τ B Φ0 Φ0 , Γ ` e2 : τ B Φ00

Φ00 , Γ ⊕ x : ∀δ.(t, δ) ` e3 : τ B Φ000

Φ, Γ ` case e1 of NULL  e2 k x  e3 : τ B Φ000

Figure 3: Typing rules

τ tb

::= ::=

(t, ν) unit | bool | int

t ν

::= ::=

tb | α | τ1 → τ2 | µα.τ ?|δ|∆

Figure 2: The types

3

A simple type system

gen(Φ, Γ, τ) = gen0 (Φ(Γ), Φ(τ)) gen0 (Γ, σ) = gen0 (Γ, ∀α.σ) gen0 (Γ, σ) = gen0 (Γ, ∀δ.σ) gen0 (Γ, σ) = σ

when α ∈ FTV(σ) ∧ α < FTV(Γ) when δ ∈ FTV(σ) ∧ δ < FTV(Γ) otherwise

Figure 4: Generalisation

or merge (E Q M ERGE) variable bindings in the Φ substitution. E Q N EW(α), installs a binding α = t0 in the substitution Φ[α We first present a rather simple type system, where the types 0 t ] (that is, Φ in which free occurences of α are replaced by carry a “nullability information” saying whether the value of 0 t ) when there is no previous binding about α in Φ. Here, t0 an expression may be NULL or not. is either µα.t or t, depending on whether α occurs or not in t. The judgements of our language’s type system are of the E Q N EW(δ) does the same, in a simpler context, on nullability 0 0 form Φ, Γ ` e : (t, ν) B Φ , where Φ and Φ are substitutions, Γ variables. is a type environment that maps program identifiers to type E Q M ERGE(α) merges a new constraint α = t0 to a previous schemes (types with a prenex universal quantification of type α = t occuring in Φ. Here, the resulting substitution Φ0 is and nullability variables). Such a judgement should be read obtained by resolving the constraint t = t0 . E Q M ERGE(δ) does as: given Φ, under assumption Γ, the expression e has type τ the same for nullability variables. with substitution Φ0 . Correctness. The operational semantics needed for stating The rules should be read as the different cases of an al0 the correction of the type system is also classical. NULL cannot gorithm that, given Φ, Γ, e, and τ, computes substitution Φ handle operations such as being called as a function, tested which, when applied to τ and Γ, assign the type Φ0 (τ) to e. In as a boolean, added as an integer, etc. The typing of values, 0 0 other words, under assumptions Φ (Γ), e has type Φ (τ). procuded by correct executions, is also slightly changed: the Because we have two kinds of variables, we have two intype (t, ?) includes NULL as well as regular values. The corstanciation mechanisms, in distinct rules: TI NST(α) for unirectness property can be stated as follows: versally quantified type variables, and TI NST(δ) for universally If Φ, Γ ` e : τ B Φ0 , then the evaluation of e in an exequantified nullability variables. cution environment compatible with Φ0 (Γ) produces Type equality constraints, introduced by typing rules, are a value typable with Φ0 (τ), if evaluation terminates. solved using a set of rules displayed in figure 5. The only interesting resolution rules are the ones that introduce (E Q N EW) Although this type system is simple and may seem practical,

3

E Q S PLIT Φ ` t 1 = t 2 B Φ0

Φ ` (t1 , ν1 ) = (t2 , ν2 ) B Φ00 E Q N EW (α) when t , α ∧ α = _ < Φ

E Q A RROW Φ ` τ1 = τ01 B Φ0

E Q B ASE

Φ0 ` ν1 = ν2 B Φ00

Φ ` tb = tb B Φ

let t0 = clos(α, Φ(t))

Φ ` τ1 → τ2 = τ01 → τ02 B Φ00

Φ`α=αBΦ E Q T RIVIAL (δ)

Φ ⊕ α = t 0 ` α = t B Φ0

Φ`δ=δBΦ

E Q M ERGE (δ) when ν , δ Φ ⊕ δ = ν0 ` ν = ν0 B Φ0

Φ ` δ = ν B Φ[δν] ⊕ δ = ν

E Q T RIVIAL (α)

E Q M ERGE (α) when t , α Φ ⊕ α = t 0 ` t = t 0 B Φ0

Φ ` α = t B Φ[αt0 ] ⊕ α = t0 E Q N EW (δ) when ν , δ ∧ δ = _ < Φ

Φ0 ` τ2 = τ02 B Φ00

Φ ⊕ δ = ν0 ` δ = ν B Φ0

clos(α, t)

= =

t µα.t

when α < FTV(t) otherwise

Figure 5: Resolution rules

As expected, the translation of the above example does not it imposes a certain style of programming where NULL values are as much isolated as possible from other parts of the pass OCaml typechecking: program. In a ML-like language, where NULL (or similar conlet (+) = ‘Some (fun x y -> struct such as None) are not as commonly used as in C or Java, match x, y with this might be acceptable. Still, one might want the following | ‘Some x, ‘Some y -> ‘Some (x+y)) example to be typable: let f = ‘Some (fun b k -> let p = (match (+) with | ‘Some f_0 -> f_0) k (‘Some 1) in if match b with ‘Some b_0 -> b_0 then k else ‘None) in . . . ^^^^^

let f b k = let p = k + 1 in if b then k else NULL in ... This program cannot typecheck since the k parameter must at the same time have type (int,∆) in order to be sent to + and (int,?) in order to have the same type as NULL.

4

Encoding nullability as variants

J NULL K = ‘None JxK = x JcK = ‘Some(c) J if e1 then e2 else e3 K = if match J e1 K with ‘Some(b) → b then J e2 K else J e3 K J λx.e K = ‘Some(λx.J e K) J case e1 of NULL  e2 k x  e3 K = match J e1 K with | ‘None → J e2 K | ‘Some(x) → (λx.J e3 K)(‘Some(x)) J e1 e2 K = (match J e1 K with ‘Some( f ) → f ) J e2 K

Error: this expression has type [> ‘None ] but an expression was expected of type [< ‘Some of int ].

This is due to the fact that the type inference of OCaml polymorphic variants use unification, even though it emulates some form of subtyping with a rich type algebra [6]. We have extended the work of Garrigue in order to have a more flexible and powerful type system for polymorphic variants. Although this is still work in progress, we show here how to apply this result to nullable types.

5

A subtyping approach

We saw in the example above that the propagation of information “backwards”, by unification in the typing environment, prevents typing some programs that could be perfectly acceptable. Replacing unification, which comes from type equality constraints, by inequality constraints, that is, by subtyping, relaxes the programming style imposed by using type unificaFigure 9: Encoding of NULL as variants tion. While this is clearly more permissive, the resolution of inequality constraints may still fail. On the one hand, some Typing nullability of our language can be easily performed unification constraints remain hidden as double inequalities by a typechecker for polymorphic variants such as those pro- (e.g. when trying to type 1 + "hello"). On the other hand, vided by OCaml. The trick is to encode NULL as ‘None, other some inequalites are clearly not satisfiable, such as those provalues as ‘Some(_), and computations must assume that only duced when typing a conditional if NULL then . . . else . . ., definite functions, that is, with shape ‘Some(_), can be ap- where one fails to prove α? 6 bool, or an application NULL(. . .), plied without further tests. In the same vein, primitive oper- failing to prove α? 6 τ1 → τ2 . Also, many primitive operaations, such as +, accept only definite arguments. The trans- tions (like (+)) won’t accept nullable arguments. We start to change the type algebra of our language and lation, given in figure 9, shows that the typability of nullable values can trivially be reduced to the typing of polymorphic introduce the syntax “t?” for nullable types, figure 10. variants. Not a big deal, but improving the latter improves The new set of typing rules is given in figure 6. The essenalso the former. tial change that we bring to our initial system is in the TA PP

4

TI NST let { α0k }n1 fresh

TC ONST Φ ` T(c) 6 τ B Φ0 Φ, Γ ` c : τ B Φ0

Φ, { αk 6 { τ6k,i }, αk > { τ>k,i }, αk ≈ { τ≈k,i } }n1 [αk α0k ]n1 , ` τ[αk α0k ]n1 6 τ0 B Φ0

Φ, Γ ⊕ x : ∀{ αk [6 { τ6k,i }][> { τ>k,i }][≈ { τ≈k,i }] }n1 .τ ` x : τ0 B Φ0 TL AMBDA let α1 , α2 fresh

Φ, Γ ⊕ x : α1 ` e : α2 B Φ0

Φ0 ` α1 → α2 6 τ B Φ00

Φ, Γ ` λx.e : τ B Φ00 TA PP let α fresh

Φ, Γ ` e1 : α → τ B Φ0 Φ, Γ ` e1 e2 : τ B Φ

TL ET let α fresh

Φ, Γ ` e1 : α B Φ0

Φ0 , Γ ` e2 : α B Φ00 00

Φ0 , Γ ⊕ x : gen(Φ0 , Γ, α) ` e2 : τ B Φ00

Φ, Γ ` let x = e1 in e2 : τ B Φ00 TI F T HEN E LSE Φ0 , Γ ` e1 : bool B Φ1

Φ1 , Γ ` e2 : τ B Φ2

TN ULL let α fresh

Φ2 , Γ ` e3 : τ B Φ3

Φ, Γ ` if e1 then e2 else e3 : τ B Φ3 TC ASE let α fresh

Φ0 , Γ ` e1 : α? B Φ1

Φ ` α? 6 τ B Φ0

Φ, Γ ` NULL : τ B Φ0 Φ1 , Γ ` e2 : τ B Φ2

Φ2 , Γ ⊕ x : α1 ` e3 : τ B Φ3

Φ0 , Γ ` case e1 of NULL  e2 k x  e3 : τ B Φ3

Figure 6: Subtyping rules

t ::= tb | α | τ1 → τ2

τ ::= t | t?

Figure 10: Nullable types gen(Φ, Γ, τ) = ∀{ α[Φ| Sα ] | α ∈ gen_vars(Φ, Γ, τ) }.τ gen_vars(Φ, Γ, τ) = α∈gen_FTV(Φ,Γ,τ) deps∗ (Φ, { α }) gen_FTV(Φ, Γ, τ) = { α | α ∈ FTV(τ) ∧ deps∗ (Φ, { α }) ∩ FTV(Γ) = ∅ } deps∗ (Φ, A) = A when deps(Φ, A) = A deps∗ (Φ, A) =S deps∗ (Φ, deps(Φ, A)) otherwise deps(Φ, A) = α∈A dep_alphas(Φ, α) S dep_alphas(Φ, α) = τ∈dep_tys(Φ,α) FTV(τ) dep_tys(Φ, α) = { τ | α 6 τ ∈ Φ ∨ τ 6 α ∈ Φ ∨ α ≈ τ ∈ Φ }

Figure 11: Generalization

rule, where the domain type of the function is constrained to be “larger” than the type of the argument in order to accept it. Intuitively, a function accepting a possibly null value as argument, accepts also a provably non-null argument. The inequality constraints, written τ1 > τ2 , are integrated in the Φ component of the typing rules by the set of resolution rules given in figure 7. At resolution time, newly integrated constraints are checked to be consistent with constraints existing in Φ. In particular, resolution performs the basic subtyping checks through rules L EQ B ASE N ULL and L EQ A RROW N ULL, on figure 7(b). When a type variable α has to be “smaller” (resp. “greater”) than two types τ1 and τ2 , the τi become constrained to be “compatible” (see figure 8), that is to differ only in their (possibly internal) “?” annotations. Generalization (figure 11) universally quantifies type variables α together with its associated constraints, written Φ|α ,

when the set { α } ∪ FTV(Φ|α ) does not intersect the set of free type variables occurring in Γ. At instanciation time, a fresh instance of constraints is reinjected in Φ. Another important change in the new system concerns the conditional, case selection (and, more generally patternmatching constructs). Instead of unifying the types of all branches, each of them is contrained to be “smaller” than the type of the construct itself. This forces all types of the branches to be compatible, but no more. See for instance rules TI F T HEN E LSE and TCASE on figure 6. This is precisely the reason why the example given at the end of section 3 is accepted by the new system.

6

Properties

We have a prototype implementation of this typing algorithm, and the proof of correctness of the extension of Garrigue’s typing of polymorphic variants, in which this algorithm can easily be translated. The proof is available online at https: //github.com/bvaugon/variants/.

7

Conclusion

We have presented two type systems and a translation algorithm aiming at inferring nullable types in ML-like languages. The first type system, rather naive and interesting by its simplicity, is probably too restrictive to be usable by daily programmers. The translation technique using standard polymorphic variants has the same weakness. However, exchanging unification against subtyping provides us with a more expressive type system. Soundness and termination properties have been checked.

5

(a) Main comparison rules GEQ Φ ` τ2 6 τ1 B Φ0 Φ ` τ1 > τ2 B Φ0

EQ Φ ` τ1 6 τ2 B Φ0

LEQN EW when τ1 6 τ2 < Φ

Φ0 ` τ1 > τ2 B Φ00

Φ ` τ1 = τ2 B Φ00

Φ, τ1 6 τ2 ` τ1 ≤ τ2 B Φ0

Φ ` τ 1 6 τ 2 B Φ0

LEQA LREADY P ROVED Φ, τ1 6 τ2 ` τ1 6 τ2 B Φ, τ1 6 τ2 (b) Standard comparison rules

L EQ B ASE T Y Φ ` tb ≤ tb B Φ

L EQ A RROW Φ ` τ01 6 τ1 B Φ0 Φ ` τ1 → τ2 ≤ L EQ A RROW N ULL Φ ` τ01 6 τ1 B Φ0

L EQ B ASE N ULL

Φ0 ` τ2 6 τ02 B Φ00 τ01



τ02



Φ ` tb ≤ tb ? B Φ

00

Φ0 ` τ2 6 τ02 B Φ00

Φ ` τ1 → τ2 ≤ (τ01 → τ02 )? B Φ00 (c) Type-variable comparison rule L EQ S AME VAR Φ`α≤αBΦ L EQ VAR L EQ T Y when τ0 , α and τ ≈ τ0 < Φ

Φ, α 6 τ, τ ≈ τ0 ` α ≤ τ0 B Φ0

Φ0 ` τ ' τ0 B Φ00

Φ, α 6 τ ` α ≤ τ0 B Φ00 G EQ VAR L EQ T Y when τ0 , α and τ0 6 τ < Φ

Φ, α 6 τ, τ0 6 τ ` τ0 ≤ α B Φ0 Φ, α 6 τ ` τ ≤ α B Φ 0

L EQ T Y L EQ VAR when τ0 , α and τ 6 τ0 < Φ

Φ0 ` τ0 ≤ τ B Φ00

00

Φ, τ 6 α, τ 6 τ0 ` α ≤ τ0 B Φ0

Φ0 ` τ ≤ τ0 B Φ00

Φ, τ 6 α ` α ≤ τ0 B Φ00 G EQ T Y L EQ VAR when τ0 , α and τ ≈ τ0 < Φ

Φ, τ 6 α, τ ≈ τ0 ` τ0 ≤ α B Φ0

Φ0 ` τ ' τ0 B Φ00

Φ, τ 6 α ` τ0 ≤ α B Φ00 L EQ VAR C PT T Y when τ0 , α and τ ≈ τ0 < Φ

Φ, α ≈ τ, τ ≈ τ0 ` α ≤ τ0 B Φ0

Φ0 ` τ ' τ0 B Φ00

Φ, α ≈ τ ` α ≤ τ0 B Φ00 G EQ VAR C PT T Y when τ0 , α and τ ≈ τ0 < Φ

Φ, α ≈ τ, τ ≈ τ0 ` τ0 ≤ α B Φ0

Φ0 ` τ ' τ0 B Φ00

Φ, α ≈ τ ` τ0 ≤ α B Φ00 L EQ VAR E ND when τ0 , α

when (∀τ | α 6 τ ∈ Φ ⇒ τ ≈ τ0 ∈ Φ)

when (∀τ | τ 6 α ∈ Φ ⇒ τ 6 τ0 ∈ Φ)

when (∀τ | α ≈ τ ∈ Φ ⇒ τ ≈ τ0 ∈ Φ)

Φ`α≤τ BΦ 0

G EQ VAR E ND when τ0 , α

when (∀τ | α 6 τ ∈ Φ ⇒ τ0 6 τ ∈ Φ)

when (∀τ | τ 6 α ∈ Φ ⇒ τ ≈ τ0 ∈ Φ) Φ ` τ0 ≤ α B Φ

Figure 7: Comparison rules

when (∀τ | α ≈ τ ∈ Φ ⇒ τ ≈ τ0 ∈ Φ)

6

(a) Main compatibility rules CPTN EW when τ1 ≈ τ2 < Φ

CPTA LREADY P ROVED

Φ, τ1 ≈ τ2 ` τ1 ' τ2 B Φ0

Φ ` τ1 ≈ τ2 B Φ

Φ, τ1 ≈ τ2 ` τ1 ≈ τ2 B Φ, τ1 ≈ τ2

0

(b) Standard compatibility rules C PTA RROW Φ ` τ1 ≈ τ01 B Φ0

C PT B ASE T Y Φ ` tb ' tb B Φ

C PT B ASE N ULL

Φ0 ` τ2 ≈ τ02 B Φ00

Φ ` τ1 → τ2 ' C PTA RROW N ULL Φ ` τ1 ≈ τ01 B Φ0

τ01



τ02



Φ ` tb ' tb ? B Φ

00

Φ0 ` τ2 ≈ τ02 B Φ00

Φ ` τ1 → τ2 ' (τ01 → τ02 )? B Φ00 (c) Type-variable compatibility rules C PT S AME VAR Φ`α'αBΦ C PT VAR L EQ T Y when τ0 , α and τ ≈ τ0 < Φ

Φ, α 6 τ, τ ≈ τ0 ` α ' τ0 B Φ0

Φ0 ` τ ' τ0 B Φ00

Φ, α 6 τ ` α ' τ0 B Φ00 C PT T Y L EQ VAR when τ0 , α and τ ≈ τ0 < Φ

Φ, τ 6 α, τ ≈ τ0 ` α ' τ0 B Φ0 Φ, τ 6 α ` α ' τ B Φ 0

C PT VAR C PT T Y when τ0 , α and τ ≈ τ0 < Φ

Φ, α ≈ τ, τ ≈ τ0 ` α ' τ0 B Φ0 Φ, α ≈ τ ` α ' τ B Φ 0

C PT VAR E ND when (∀τ | α 6 τ ∈ Φ ⇒ τ ≈ τ ∈ Φ) 0

Φ0 ` τ ' τ0 B Φ00

00

Φ0 ` τ ' τ0 B Φ00

00

when τ0 , α when (∀τ | τ 6 α ∈ Φ ⇒ τ ≈ τ0 ∈ Φ)

when (∀τ | α ≈ τ0 ∈ Φ ⇒ τ ≈ τ0 ∈ Φ)

Φ`α'τ BΦ 0

Figure 8: Compatibility rules

References [1] Apple (2014): Swift, a new programming language for iOS and OS X. Available at https://developer.apple.com/swift. [2] Facebook (2014): HHVM/Hack/Nullable. Available at http: //docs.hhvm.com/manual/en/hack.nullable.php. [3] Facebook (2014): Programming productivity without breaking things. Available at http://hacklang.org/. [4] Jacques Garrigue (1998): Programming with polymorphic variants. Available at http://caml.inria.fr/pub/papers/ garrigue-polymorphic_variants-ml98.pdf. [5] Jacques Garrigue (2001): Labeled and optional arguments for Objective Caml. Available at http://wwwfun.kurims. kyoto-u.ac.jp/~garrigue/papers/ppl2001.ps.gz. [6] Jacques Garrigue (2002): Simple type inference for structural polymorphism. In: The Ninth International Workshop on Foundations of Object-Oriented Languages. Available at http://www.math.nagoya-u.ac.jp/~garrigue/papers/ structural-inf.pdf. Revised on 2002/12/11. [7] C. A. R. Hoare (2009): Null References: The Billion Dollar Mistake. In: Proceedings of QCon, Historically Bad Ideas, London, UK.

[8] Laurent Hubert, Thomas Jensen & David Pichardie (2008): Semantic Foundations and Inference of Non-null Annotations. Available at http://hal.inria.fr/inria-00332356/en/. [9] JaneStreet: Package core. Available at https://ocaml. janestreet.com/ocaml-core/latest/doc/core. [10] Xavier Leroy, Damien Doligez, Jacques Garrigue, Didier Rémy & Jérôme Vouillon (2008): The Objective Caml system (release 4.01): Documentation and user’s manual. Institut National de Recherche en Informatique et en Automatique. Available at http://caml.inria.fr/pub/docs/manual-ocaml/. [11] Microsoft (2014): Nullable Types (C# Programming Guide). Available at http://msdn.microsoft.com/en-US/library/ 1t3y8s4s.aspx. [12] Atsushi Ohori (1995): A Polymorphic Record Calculus and Its Compilation. ACM Transactions on Programming Languages and Systems 17(6), pp. 844–895. Available at http://www. riec.tohoku.ac.jp/~ohori/research/toplas95.pdf. [13] Didier Rémy (1989): Typechecking Records and Variants in a Natural Extension of ML. In: POPL: 16th ACM SIGACTSIGPLAN Symposium on Principles of Programming Languages. Available at http://gallium.inria.fr/~remy/ftp/ taoop1.pdf.

Nullable Type Inference - OCaml

Dec 11, 2002 - [1] Apple (2014): Swift, a new programming language for iOS and. OS X. Available at https://developer.apple.com/swift. [2] Facebook (2014): ...

154KB Sizes 3 Downloads 272 Views

Recommend Documents

Nullable Type Inference - OCaml
Dec 11, 2002 - Imperative programming languages, such as C or Java deriva- tives, make abundant ... In languages using the ML type discipline, the option type type α option ..... //docs.hhvm.com/manual/en/hack.nullable.php. [3] Facebook ...

Practical Type Inference for the GADT Type System
opportunity to develop my interests in computer science and to pursue graduate ...... algebraic data types that I made in the course of this dissertation research. Here ..... APP This rule types a function application by typing the function (f) and i

Practical Type Inference for the GADT Type System
Portland State University ... opportunity to develop my interests in computer science and to pursue graduate ..... 7.13 Type inference for reified state monad (1).

Type Inference Algorithms: A Survey
An overview of type inference for a ML-like language can be found ..... this convention early on because it was built into some of the Coq libraries we used in our.

Polymorphism, subtyping and type inference in MLsub - ML Family ...
Sep 3, 2015 - Polymorphism, subtyping and type inference in. MLsub. Stephen Dolan and Alan Mycroft ... We have two tricks for getting around the difficulties: • Define types properly. • Only use half of them. 2 ... Any two types have a greatest c

Practical Type Inference for the GADT Type System - A ...
Department of Computer Science. Portland State University. June 1, 2010. Chuan-kai Lin. Practical Type Inference for the GADT Type System. 1 / 75 ...

Polymorphism, subtyping and type inference in MLsub - ML Family ...
Sep 3, 2015 - Polymorphism, subtyping and type inference in. MLsub. Stephen Dolan and Alan Mycroft ... We have two tricks for getting around the difficulties: • Define types properly. • Only use half of them. 2 ... Any two types have a greatest c

Commons OCaml Library - GitHub
Dec 29, 2009 - reverse [x]. = [x]. )ig let b = laws "app " (fun (xs,ys) -> reverse (xs++ys) ...... implemented in OCaml, using the standard example of a calculator.".

OCaml Development - GitHub
Dec 29, 2009 - OCaml is a powerful language, trust me. 1.1 OCaml vs Other Programming Languages. 1.2 Toolset. 1NOTE: convention: use we/you, but try to ...

ocaml tutorial pdf
Retrying... Download. Connect more apps... Try one of the apps below to open or edit this item. ocaml tutorial pdf. ocaml tutorial pdf. Open. Extract. Open with.

Relational Conversion for OCaml - ML Family Workshop
preters (Programming Pearl) // Proceedings of the 2012 Work- shop on Scheme and Functional Programming (Scheme '12). [5] Henk Barendregt. Lambda ...

ocaml for scientists pdf
Page 1 of 1. File: Ocaml for scientists pdf. Download now. Click here if your download doesn't start automatically. Page 1 of 1. ocaml for scientists pdf. ocaml for ...

ocaml for scientists pdf
ocaml for scientists pdf. ocaml for scientists pdf. Open. Extract. Open with. Sign In. Main menu. Displaying ocaml for scientists pdf.

inference-progressions-teaching - CensusAtSchool
Reinforcing & developing ANALYSIS statements. - Comparative descriptions of sample distributions. → always use variable, value, unit. → centres (medians), shift/overlap (position of middle 50% relative to each other), spread. (IQR – consistency

Variational Program Inference - arXiv
If over the course of an execution path x of ... course limitations on what the generated program can do. .... command with a prior probability distribution PC , the.

Variational Program Inference - arXiv
reports P(e|x) as the product of all calls to a function: .... Evaluating a Guide Program by Free Energy ... We call the quantity we are averaging the one-run free.

inference-progressions-teaching - CensusAtSchool
show up consistently if we repeatedly sampled. → introduce ... Don't “POP in your PEE” – student ANALYSIS descriptions (PEE) often include the population.

VOCAL – A Verified OCAml Library - ML Family Workshop
Libraries are the basic building blocks of any realistic programming project. It is thus of utmost .... verification of object-oriented programs. In 21st International ...

VOCAL – A Verified OCAml Library - ML Family Workshop
OCaml is the implementation language of systems used worldwide where stability, safety, and correctness are of ... An overview of JML tools and applications.

Compiling Links Effect Handlers to the OCaml Backend
The University of Edinburgh .... of intermediate representations (IRs), where the top representation is known as Lambda. .... Methods in Computer Science, 2013.

Relational Conversion for OCaml - The ML Family Workshop
St.Petersburg State University .... Logic in Computer Science (Vol. 2), 1992. [6] William E. ... Indiana University, Bloomington, IN, September 30, 2009. [7] Dmitry ...