Fino is a tiny programming language implemented in Haskell. It has a Hindley/Milner style polymorphic type system which is an simple implementation of the algorithm M [1].
The algorithm M is a top-down (or context-sensitive) algorithm. M can always find type errors earlier than the algorithm W which is buttom-up.
I hope this help to implement let-polymorphic type inference.
The Following gives types and expressions in Fino.
Syntax:
e ::= c (constant literal)
| x (variable)
| e op e (binary operator)
| fun x -> e (lambda abstraction)
| e e (application)
| let e = e in e (let-binding)
| let rec e = e in e
| fix f e (fixed-point)
| if e then e else e
Types:
t ::= Int | Bool (base type)
| t -> t (function type)
| ∀a1...an.t (type schema)
Also see Syntax.hs.
You can use the fino command to open a Fino REPL.
$ ./fino
Fino 0.2.1.0
>>> When you type a expression (and hit enter), Fino will then evaluate that expression.
>>> 1 + 2
expr: EOp Add (ELit (LInt 1)) (ELit (LInt 2))
type: TBase TInt
value: VInt 3Type :quit to exit the REPL.
>>> :quit== is a polymorphic operator:
let n = 1 in
let b = n == 1 in
b == TrueThe identity function as a polymorphic function:
let id = (fun x -> x) in
let n = id 1 in
let b = id True
in n + 1
expr: ELet "id" (ELam "x" (EVar "x")) (ELet "n" (EApp (EVar "id") (ELit (LInt 1))) (ELet "b" (EApp (EVar "id") (ELit (LBool True))) (EOp Add (EVar "n") (ELit (LInt 1)))))
type: TBase TInt
value: VInt 1The Fibonatti function:
let fib = fix f (fun x ->
if x==0 || x==1
then 1
else f (x-1) + f (x-2))
in fib 10
expr: ELet "fib" (EFix "f" (ELam "x" (EIf (EOp Or (EOp Eq (EVar "x") (ELit (LInt 0))) (EOp Eq (EVar "x") (ELit (LInt 1)))) (ELit (LInt 1)) (EOp Add (EApp (EVar "f") (EOp Sub (EVar "x") (ELit (LInt 1)))) (EApp (EVar "f") (EOp Sub (EVar "x") (ELit (LInt 2)))))))) (EApp (EVar "fib") (ELit (LInt 10)))
type: TBase TInt
value: VInt 89The above expression can be written using let rec as follows:
let rec fib x =
if x==0||x==1
then 1
else fib (x-1) + fib (x-2)
in fib 10[1]: Oukseh Lee and Kwangkeun Yi. 1998. Proofs about a folklore let-polymorphic type inference algorithm. ACM Trans. Program. Lang. Syst. 20, 4 (July 1998), 707-723.