X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=blobdiff_plain;f=assignment5.mdwn;h=73ebb5196ee280934652add9f9a29cb692204640;hp=fab21e49e9e3d35014a2772942314003850187e3;hb=a5612ad05978d5d95334ae77141bf89a172c15a4;hpb=a62a6d29714711535dd7a1eb6a1d0611bf4f739b diff --git a/assignment5.mdwn b/assignment5.mdwn index fab21e49..73ebb519 100644 --- a/assignment5.mdwn +++ b/assignment5.mdwn @@ -13,9 +13,7 @@ Types and OCaml - : int = 1 -1. Which of the following expressions is well-typed in OCaml? - For those that are, give the type of the expression as a whole. - For those that are not, why not? +1. Which of the following expressions is well-typed in OCaml? For those that are, give the type of the expression as a whole. For those that are not, why not? let rec f x = f x;; @@ -165,7 +163,7 @@ times. In the polymorphic encoding above, the result of that iteration can be any type 'a, as long as you have a base element z : 'a and a function s : 'a → 'a. **Excercise**: get booleans and Church numbers working in OCaml, -including OCaml versions of bool, true, false, zero, succ, add. +including OCaml versions of bool, true, false, zero, iszero, succ, and **pred**. Consider the following list type: @@ -174,8 +172,8 @@ Consider the following list type: We can encode τ lists, lists of elements of type τ as follows: τ list := ∀'a. 'a → (τ → 'a → 'a) → 'a - nilτ := Λ'a. λn:'a. λc:τ → 'a → 'a. n - makeListτ := λh:τ. λt:τ list. Λ'a. λn:'a. λc:τ → 'a → 'a. c h (t ['a] n c) + nil τ := Λ'a. λn:'a. λc:τ → 'a → 'a. n + make_list τ := λh:τ. λt:τ list. Λ'a. λn:'a. λc:τ → 'a → 'a. c h (t ['a] n c) As with nats, recursion is built into the datatype. @@ -185,17 +183,18 @@ We can write functions like map: = λf :σ → τ. λl:σ list. l [τ list] nilτ (λx:σ. λy:τ list. consτ (f x) y **Excercise** convert this function to OCaml. Also write an `append` function. -Test with simple lists. +Also write a **head** function. Also write nil??? Test with simple lists. + Consider the following simple binary tree type: type 'a tree = Leaf | Node of 'a tree * 'a * 'a tree **Excercise** -Write a function `sumLeaves` that computes the sum of all the +Write a function `sum_leaves` that computes the sum of all the leaves in an int tree. -Write a function `inOrder` : τ tree → τ list that computes the in-order traversal of a binary tree. You +Write a function `in_order` : τ tree → τ list that computes the in-order traversal of a binary tree. You may assume the above encoding of lists; define any auxiliary functions you need. Baby monads