[Haskell-cafe] Re: Class Interfaces in OOHaskell?

Scott West saynte at gmail.com
Fri Jul 6 18:11:42 EDT 2007


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 <saynte at gmail.com> 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
>


More information about the Haskell-Cafe mailing list