Folks

[statutory warning: functors, terminal objects, unsafeCoerce]

I had a peculiar notion this morning to wonder whether I could
get away with

  shape :: Functor f => f a -> f ()
  shape fa = unsafeCoerce fa

Sure enough, ghci gives me

*Top> shape "moo"
[(),(),()]
*Top> shape [undefined]
[*** Exception: Prelude.undefined

which shows that pattern matching does just enough work to
check that an element of () isn't bottom. I'm just wondering
if that's really what's happening, what other implementations
do, and how the garbage collector would react: would all
those a's hang around for as long as the shape?

I'm also wondering whether it makes sense to have a
"bottomless Top" type, with constructor _ and lazy pattern _
(with (undefined :: Top) equal to _). Then the constant-time
shape operator makes the same sort of sense as the
constant-time

  inflate :: Functor f => f Zero -> f a

Any thoughts on either or both?

Cheers

Conor

_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to