# Subtyping

**Fritz K Ruehr
**
fruehr@willamette.edu

*Tue, 21 Aug 2001 14:49:12 -0700 (PDT)*

[sorry about that, let's try again...]
Ross Paterson wrote (in regards variations on factorial):
>* Another version:
*>*
*>* fac = foldr (*) 1 . unfoldr (\n -> guard (n > 0) >> return (n, n-1))
*
Thanks for forwarding this; may I quote it on the web site? (with full
attribution, of course) If so, you are welcome to give it a name and
a pithy little "slogan" (also for the one below).
>* Also, the combinatory programmer would regard defining y by recursion
*>* as cheating, and would probably prefer one of these versions:
*>*
*>* newtype SelfApp a = SA (SelfApp a -> a)
*>*
*>* selfApply :: SelfApp a -> a
*>* selfApply (SA f) = f (SA f)
*>*
*>* yCurry :: (a -> a) -> a
*>* yCurry f = selfApply (SA (\x -> f (selfApply x)))
*>*
*>* yTuring :: (a -> a) -> a
*>* yTuring = selfApply (SA (\x f -> f (selfApply x f)))
*
Yes, this is definitely the right way to go here. I comment on the
site about the fact that we should really *define* Y (and I felt
a bit guilty about it :) ), but I didn't try hard enough to get
around the typing issue. You have done so quite elegantly.
Of course, there is also a trade-off at some point between the
impact of the various examples and their sheer number (I added
an environment-model based interpreter yesterday that started
to push this boundary). Still, more monads (arrows, even?) are
needed.
-- Fritz Ruehr
PS: for those who missed it, the site is at:
<http://www.willamette.edu/~fruehr/haskell/evolution.html>