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

Brandon Michael Moore brandon at heave.ugcs.caltech.edu
Fri Jul 6 20:24:18 EDT 2007


On Fri, Jul 06, 2007 at 06:11:42PM -0400, Scott West wrote:
> 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?

In Haskell type synonyms can't be recursive. You can use a newtype - the
wrapper has no runtime cost, it's just an instruction to the typechecker,
much like the explicit rolling and unrolling in an "isorecursive" treatment
of recursive types.

I think it's about as easy to build a typesystem with recursive types,
the problem is that a lot of bogus programs typecheck. See
http://www.haskell.org/pipermail/haskell-cafe/2006-December/020074.html

Matthias Blume et. al. have made a language called MLPolyR with
extensible records and variants (with case expressions and exception
handling built from them), and report that it works pretty well to
infer infinite types only if they recurse through a record or variant
type.

Brandon


More information about the Haskell-Cafe mailing list