Black Hole's in Hugs?

pablocardenal@laplatavive.com pablocardenal@laplatavive.com
Mon, 9 Apr 2001 20:22:31 -0300


Hi, 

I'm  extract this fragment of code from my tesis program.
I'm try to reduce more, but i can't.

The concrete question is: What does {_Gc Black Hole} mean?

=======================================================
===== Concrete problem here, implementation later =====
=======================================================

I'm execute mainOk and receive the expected result

Main> mainOk
Dyn Hello World!!
(82 reductions, 196 cells)    

I'm  execute main and system stop, not reduction executed
(27 reductions in five minutes of wait) 
                            
Main> main
{Interrupted!}

(27 reductions, 64 cells) 

I'm expected Dyn <Hello World !!>

I'm break and re run and receive the message

Main> main

Program error: {_Gc Black Hole}
(8 reductions, 51 cells)


What does _Gc Black Hole mean?


=======================================================
========== Implementation can look here ===============
=======================================================


Tested on Hugs 98 February 2001 in Windows 98  
with options -98 +som

=======================================================
================ Class Result =========================
=======================================================

>class Result r where
> toString :: r -> String
> fromString :: String -> r
> toR :: Result r' => r -> r'
> fromR :: Result r' => r'-> r

=======================================================
============ Class SubResult ==========================
=======================================================

>class Result a => SubResult a  where
> toHtml :: a -> Html
> fromHtml :: Html -> a

=======================================================
========= Html data type ==============================
=======================================================

>newtype Html = Html String deriving Show

=======================================================
========= Html are Result and SubResult ===============
=======================================================

>instance Result Html where
>  toString (Html st) =  st
>  fromString st = Html ("<" ++ st ++ ">")
>  toR (Html st) = toR st
>  fromR r = toR r

>instance SubResult Html where
>  toHtml = id
>  fromHtml = id

=======================================================
=========== Dyn data type =============================
=======================================================

>data Dyn = forall a . SubResult a => Dyn a

>instance Show Dyn where
>  show (Dyn x) = "Dyn " ++ toString x

=======================================================
=========== Dyn are Result and SubResult ==============
=======================================================

>instance Result Dyn where
>  toString (Dyn x) = toString x
>  fromString st = Dyn st
>  fromR = toR
>  toR (Dyn x) = toR x

>instance SubResult Dyn where
>  toHtml (Dyn x) = toHtml x
>  fromHtml html = Dyn html


=======================================================
============ String are Result and SubResult ==========
=======================================================

>instance Result String where
>  toString = id
>  fromString = id
>  fromR = toString
>  toR = fromString

>instance SubResult String where
>  toHtml st = fromString st
>  fromHtml html = toString html

=======================================================
=============== Rule Class ============================
=======================================================

>class  (Result r)  => Rule e r where
>   apply ::  e r -> r -> r
>   rws ::  (Result r') => (r -> r') -> e r 

=======================================================
=============== SubRule Class =========================
=======================================================

>class  (Rule e r, SubResult r)  => SubRule e r where
>   rwsS ::  (SubResult r') => (r -> r') -> e r 


=======================================================
======== TRule data type ==============================
=======================================================

>newtype TRule r = TRule (r -> r)

=======================================================
========= TRule are Rule ==============================
=======================================================

>instance Result a => Rule TRule a where
> apply (TRule f) r =  f r
> rws f = TRule (\r -> toR (f r))

=======================================================
=========TRule are SubRule ============================
=======================================================

>instance  SubResult a => SubRule TRule a where
> rwsS f = TRule (\r -> toR $ toHtml (f r))

=======================================================
========== Examples ===================================
=======================================================

>genRule1 :: Rule e r => e r 
>genRule1 =
>   rws (\r -> toR r ++ "!!") 

>genRule2 :: SubRule e r => e r 
>genRule2 =
>   rwsS (\r -> toR r ++ "!!") 

>mainOk:: Dyn
>mainOk = apply (genRule1::TRule Dyn) (toR "Hello World")

>main :: Dyn
>main = apply (genRule2::TRule Dyn) (toR "Hello World")

========================================================
===================== The end ==========================
========================================================

Saludos

Pablo "Yeti" Cardenal from La Plata, Buenos Aires, Argentina