I wrote:
1. Find a way to model strictness/laziness properties
of Haskell functions in a category in a way that is
reasonably rich.

Duncan Coutts wrote:
The reason it's not obvious for categories is because
the semantics for Haskell comes from domain theory
(CPOs etc) not categories.

The category we have been discussing seems to
do the trick quite easily for (1):

Let Empty be the empty type. Let undef = \x -> undefined,
and as before,

f .! g = f `seq` g `seq` (\x -> f (g x))

Then we can take HaskL - Haskell with Laziness - to be
the category Haskell types and Haskell functions
(including seq), with .! as composition. It is easy to
check that this is a category, using the left-monoid
laws for seq:

(x `seq` y) `seq` z = x `seq` (y `seq` z)
(x `seq` y) `seq` z = (y `seq` x) `seq` z
(\x -> expr) `seq` y = y

Empty is bi-universal in HaskL, with undef
the unique morphism in either direction. We
have undef .! f = undef for any three types and
any morphism f.

We say that a morphism f is strict iff f .! undef = undef.

We will only consider functors (F, fmap) on HaskL that are natural,
in the sense that fmap is a morphism from (A -> B) to
(F(A) -> F(B)) for all A, B. Similarly for return and
join with monads.

It is easy to show that a functor (F, fmap) preserves
strictness if fmap is strict as a morphism.

-Yitz
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to