| This is a course page of David Casperson |
|
All Homework is now due.
undefinederrorflip where flip f x y = f y x
const where const x y = xconst False
id where id x = xcurry where curry f x y = f(x,y)
>uncurry where uncurry f (x,y) = f x
y
(Thiw is also question 16.)A combinator is a function that depends on nothing other than its arguments. There are a number of combinators built in to Haskell, as illustrated by the last question.
Another thoeretically important combinator is the mu or Y combinator.
mu where mu f x = f (mu f)
x?data W a b = Wx(W a b -> a
-> b)ww
where ww f (Wx g) x = f (g (Wx g)) x?
mu2
where mu2 f x = ww f (Wx (ww f)) x?
Note that the definition of mu2 only involves recursion
in that it uses the W data type.
There is a theorem that says that in a typed language like
Haskell, you minimally need to use a
recursive data type to define mu or mu2.
In Scheme you can just write
(define ((w f g) x) ((f (g g)) x).
(there are three parts of this question that actually need answers.)
mu2.)
factFact where factFact fact n = if (n==(0::Int))
then 1
else toInteger n * fact(n-1);?
factFact recursive? Answer No.factFact udefined 0
factFact udefined 1
(factFact . factFact $ udefined) 1
(factFact . factFact $ udefined) 2
(factFact . factFact . factFact $ udefined) 2
mu2 factFact(do not worry overly about the value above.)
mu2 factFact 5
[]?drop 3 "cat"?drop 3 ["cat"]?[]==drop 3 "cat"?
drop 3 ["cat"]==drop 3 "cat"?
data VeryEmpty a = VoidThis has
Functor,
Applicative,
Monad,
Foldable, and
Traversable
instances.
(Some of these can be guessed from the definitions for the
Nothing case of Maybe.)
Define these instances. Be sure to test your code. It may be helpful to use
data VeryEmpty a = Void deriving Show
Tree a type defined by
data Tree a
= EmptyTree
| Node a (Tree a) (Tree a)
have a Foldable instance.
Tree a type defined by
data Tree a
= EmptyTree
| Node a (Tree a) (Tree a)
have a Traversable instance.
\ mm -> do { m <- mm ; m }
?
do-block and make this as pointless as possible.uncurry where uncurry f (a,b) = f a b What does uncurry do?
Tree a type defined by
data Tree a
= EmptyTree
| Node a (Tree a) (Tree a)
have a Functor instance.
For the “Tree a” discussed in class, write
a continuation-passing style tail-recursive algorithm
to mirror a tree.
“Defunctionalize” your continuations.
What is an upper bound on the size of your continuations?
foldr has a leftist cousin
foldl defined by
foldl f a [] = a
foldl f a (x:xs) = foldl f (f a x) xs
foldl? How can you deduce
this without using ghci :type?
foldl can be written in terms of foldr
foldl f a xs = foldr (g f) id xs a where
g …
What is the type of g?
Write a definition for g.
How “pointless” can you make g?
Integer
to String function can be found on
the Blacboard site.
Complete the code, or write your own from scratch, to provide a function to convert integers up to ??? into strings.
![]() |
|
|
![]() |
Winter 2022 |
|
| 2025-11 |
|
fall-2024