This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
type BaseTyCon = TyConNumber | |
| TyConBool | |
| TyConUnit | |
| TyConList | |
| TyConFun | |
| TyConTuple | |
| TyConUserDefined of string | |
type TyCon = TyCon of BaseTyCon * Kind |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
type Kind = Star | KFun of Kind * Kind |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let rec kindStack numTyArgs = | |
match numTyArgs with | |
| 0 -> Star | |
| n -> KFun (Star, kindStack (n - 1)) | |
let tNumber = TConExpr (TyCon (TyConNumber, Star)) | |
let tBool = TConExpr (TyCon (TyConBool, Star)) | |
let tUnit = TConExpr (TyCon (TyConUnit, Star)) | |
let tArrow = TConExpr (TyCon (TyConFun, KFun (Star, KFun (Star, Star)))) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let baseTyConString b = | |
match b with | |
| TyConNumber -> "Number" | |
| TyConBool -> "Bool" | |
| TyConUnit -> "()" | |
| TyConUserDefined name -> name | |
| _ -> sprintf "%A" b | |
let parens s = sprintf "(%s)" s |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let rec tysubst theta t = | |
match t with | |
| TVarExpr u -> | |
match Map.tryFind u theta with | |
| Some t' -> t' | |
| None -> t | |
| TApExpr (l, r) -> | |
TApExpr (tysubst theta l, tysubst theta r) | |
| _ -> | |
t |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
type ErrorMessage = Lazy<string> | |
type Constraint = Equal of TyExpr * TyExpr * ErrorMessage | |
| And of Constraint * Constraint | |
| Trivial | |
let (=~=) q1 q2 err = Equal (q1, q2, err) | |
let (&&&) c1 c2 = And (c1, c2) | |
let rec conjoinConstraints cc = |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
exception TypeError of string | |
// Some useful extensions to F#'s map module | |
module Map = | |
let keys m = m |> Map.toSeq |> Seq.map fst |> Set.ofSeq | |
let fromKeys f keys = | |
Seq.fold (fun accum k -> Map.add k (f k) accum) Map.empty keys | |
let singleton key value = |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[<EntryPoint>] | |
let main argv = | |
let solveAndCatch con = | |
try | |
printf "%A\n\n" (solve con) | |
with | |
| TypeError s -> | |
printf "%s" s | |
let t1 = tTuple [freshtyvar () |> TVarExpr; tNumber] | |
let t2 = tTuple [tUnit; freshtyvar () |> TVarExpr] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
map | |
[(TyVar ("t1",Star), TConExpr (TyCon (TyConUnit,Star))); | |
(TyVar ("t2",Star), TConExpr (TyCon (TyConNumber,Star)))] | |
Type error: The types () and Number are not equal. | |
Clearly unit isn't the same type as a number |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
myconcat xs ys = xs ++ ys | |
greet = myconcat "Hello " |
OlderNewer