I conquered the below problem, but now I have another question:

How can one have two interface-classes that reference each other? For example,

type Inter1 = Record (
 MkFoo :=: Inter2 -> IO ()
 :*: HNil )

type Inter2 = Record (
 MkBar :: Inter1 -> IO ()
 :*: HNil )

Obviously this is cyclical, but is there a nice way to get around it?
I think I could wrap them up in a datatype (ie, data InterOne =
InterOne Inter1, and modify definitions accordingly) but are there any
alternative methods?

Scott


On 7/6/07, Scott West <[EMAIL PROTECTED]> wrote:
Hello all,

Looking at the OOHaskell black (grey?) magic, and wondering if there
would be an interesting way to construct class interfaces using the
OOHaskell paradigm?

I'm trying to do it as so (assume relevant types/proxies declared):

type FigureInter = Record ( Draw :=: IO ()
                        :*: HNil
                            )

figure self = do
  return emptyRecord
  where
    _ = narrow self :: FigureInter

abstrFigure self = do
  super <- figure self
  visible <- newIORef True
  returnIO
    $   setVisible .=. (\b -> writeIORef visible b)
    .*. isVisible  .=. readIORef visible
    .*. draw       .=. return ()
    .<. super

but ghci complains (you know how it likes to complain), with

    Couldn't match expected type `Record t2'
           against inferred type `F (Proxy Draw) (m ())'
    In the second argument of `(.*.)', namely `draw .=. (return ())'
    In the second argument of `(.*.)', namely
        `(isVisible .=. (readIORef visible)) .*. (draw .=. (return ()))'
    In the first argument of `(.<.)', namely
        `(setVisible .=. (\ b -> writeIORef visible b))
       .*.
         ((isVisible .=. (readIORef visible)) .*. (draw .=. (return ())))'

Anyone have any tips they care to share? :)

Scott

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

Reply via email to