[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