Homework 6
Types and type checking
This homework is written in literate Haskell; you can download the raw source to fill in yourself. You’re welcome to submit literate Haskell yourself, or to start fresh in a new file, literate or not.
Please submit homeworks via the DCI submission page.
module Hw06 where
import qualified Data.Map as Map
import Data.Map (Map, (!))
Problem 1: Haskell’s type system
Explain the Haskell type for each of the following declarations:
a x y = x ++ " " ++ y
b x y = x:head y
c f = \y → f y
d (f,x) = f (f x)
e x y b = if b y then x else y
f x y = foldl x Nothing (reverse y)
Because you can of course run the type checker yourself to determine their type, be sure to write a short explanation to show that you understand why the function has the type you give.
Problem 2: type checker for Expr
Write a type checker for the Expr
language. Here’s the AST along with the types you should use.
type Id = String
data Expr =
EVar Id
| ETrue
| EFalse
| EIf Expr Expr Expr
| ENum Int
| EIncr Expr
| EDecr Expr
| EIsZero Expr
| EApp Expr Expr
| ELam Id Type Expr
deriving (Show, Eq)
data Type =
TyBool
| TyNum
| TyArrow Type Type
deriving (Show, Eq)
type Context = Map Id Type
typeCheck :: Context -> Expr -> Either String Type
typeCheck _ _ = undefined
Be certain to return good error messages as applicable.
Problem 3: working with type theory
(a) 10 points
Suppose we wanted to add pairs to the type system for Expr
. You don’t need to implement this change, just tell me everything you would have to do: how would you change the Type
datatype? What about Expr
?
(b) 10 points
Write the typing rules for pairs, i.e., the inference-style rules we’ve used in class.
Problem 4: static and dynamic scope
Please do problem 7.8 from Mitchell, page 196.
Problem 5: eval and scope
Please do problem 7.10 from Mitchell, page 197. You only need to do parts b and c, but please read part a so that the rest makes sense.
Problem 6: lambda calculus and scope
Please do problem 7.11 from Mitchell, page 198.