[Haskell-cafe] Re: Full strict functor by abusing Haskell exceptions

wren ng thornton wren at freegeek.org
Thu Sep 16 00:45:37 EDT 2010


On 9/13/10 6:23 PM, Paolo G. Giarrusso wrote:
> Then, I would also like to understand what exactly a strict functor
> is, in detail, and/or a link to the post you reference.

I'm assuming the OP was referring to a functor for strictness I 
mentioned recently in the discussion about pointed functors. That is,

     newtype Strict a = Strict a

     instance Functor Strict where
         -- This isn't a lawful endofunctor
         fmap f (Strict a) = Strict (f $! a)

     instance Pointed Strict where
         -- This isn't lawful either, as an endofunctor
         point = Strict

The idea being that we make all applications strict. However, that 
definition of fmap isn't lawful because we don't have that fmap(f . g) = 
(fmap f).(fmap g) for all f and g. In particular, it fails when (f . g) 
is bottom eating, i.e. when (g x == _|_) =/=> (f (g x) == _|_).

We can, however, define strict composition:

     (f .! g) x = f $! g x

And we do have that fmap(f .! g) = (fmap f).(fmap g) for Strict. So, 
Strict is a (category theoretic) functor, it's just not an endofunctor 
on Hask.

Given that any functor for adding strictness will have to deal with the 
same issue of preserving bottom-eating compositions, I postulated that 
there exists no functor from (all of) Hask to !Hask. But, since !Hask is 
a subcategory of Hask, it's trivial to go the other direction. In fact, 
the Strict defined above can be considered as the inclusion functor from 
!Hask to Hask by making the strictness of !Hask explicit. This also 
allows Strict to be considered a pointed functor since fmap f . point = 
point . f for strict functions f.

I haven't looked through the suggested code to see if it can actually 
work around the problem.

-- 
Live well,
~wren


More information about the Haskell-Cafe mailing list